【问题标题】:Append symbol name when using custom section attribute使用自定义部分属性时附加符号名称
【发布时间】:2018-04-13 00:48:30
【问题描述】:

下面是我用于嵌入式系统的代码片段。我将-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*)

我有一个大量使用自定义部分的大型代码库,不希望手动修改每个声明。

【问题讨论】:

    标签: c gcc linker ld


    【解决方案1】:

    如果没有人有更好的主意,这里有一个适合你的组合:

    #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”和“string literal concatenation”的标准C特性来合成你想要的section属性。

    【讨论】:

      【解决方案2】:

      扩展你的宏怎么样?

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多