下面是我用于嵌入式系统的代码片段。我将-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文件中定义a3
和a4
,则会将它们放在两个不同的部分中,名称为.fast.data
,但是对于每个文件。垃圾收集器将按预期工作。
即使使用gcc
,有没有办法告诉__attribute__((section("...")))
附加符号名称?
对于a4
,我的情况会导致.fast.data.a4
。
在链接描述文件中,我将捕获所有*(.fast.data*)
。
我有很多使用自定义部分的代码库,并且不希望对每个声明进行手动修改。
答案 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