使用自定义节属性时附加符号名称

时间:2017-10-31 18:35:01

标签: c gcc linker ld

下面是我用于嵌入式系统的代码片段。我将-ffunction-sections-fdata-sections选项传递给gcc

#define FAST_DATA __attribute__((section(".fast.data")))

          int a1 = 1;
          int a2 = 1;
FAST_DATA int a3 = 1;
FAST_DATA int a4 = 1;

链接器将按如下所示分配这些符号(映射文件):

 .data.a1       0x20000020        0x4 ./main.o
                0x20000020                a1

 .data.a2       0x20000024        0x4 ./main.o
                0x20000024                a2

 .fast.data     0x10000010        0x8 ./main.o
                0x10000010                a4
                0x10000014                a3

例如,如果我不使用变量a2,链接器将丢弃它(我将--gc-sections传递给ld)。 但是,如果我使用a3而不使用a4,那么a4将不会被丢弃。我猜这是因为它与a3放在同一部分。

如果我在单独的.c文件中定义a3a4,则会将它们放在两个不同的部分中,名称为.fast.data,但是对于每个文件。垃圾收集器将按预期工作。

即使使用gcc,有没有办法告诉__attribute__((section("...")))附加符号名称? 对于a4,我的情况会导致.fast.data.a4。 在链接描述文件中,我将捕获所有*(.fast.data*)

我有很多使用自定义部分的代码库,并且不希望对每个声明进行手动修改。

2 个答案:

答案 0 :(得分:3)

如果没有其他人有更好的主意,这里有一个适合你的地方:

#define DECLARE_FAST_DATA(type, name) \
    __attribute__((section(".fast.data." #name))) type name

用法:

int a1 = 1;
int a2 = 1;
DECLARE_FAST_DATA(int, a3) = 1;
DECLARE_FAST_DATA(int, a4);

这使用" stringification"的标准C功能。和" string literal concatenation"合成你想要的section属性。

答案 1 :(得分:0)

如何扩展您的宏?

#define FAST_DATA(_a,_b,_c) \
  __attribute__((section(".fast.data." #_b))) _a _b = _c