【发布时间】: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 文件中定义 a3 和 a4,它们将被放在两个不同的部分中,名称相同 .fast.data,但对于每个文件。垃圾收集器将按预期工作。
有没有办法告诉gcc 即使在使用__attribute__((section("..."))) 时也要附加符号名称?
对于a4,就我而言,这将导致.fast.data.a4。
在链接器脚本中,我将捕获所有*(.fast.data*)。
我有一个大量使用自定义部分的大型代码库,不希望手动修改每个声明。
【问题讨论】: