如果在链接描述文件中未定义属性部分,是否有办法让编译器警告/错误?

时间:2018-10-18 01:52:55

标签: gcc linker arm

使用用于arm微控制器的arm-none-eabi-gcc编译器工具链,并在FLASH中定义此foo变量所在的特定部分。

假设我有示例定义:

int foo __attribute__((section(".bar"))) = 5;

我观察到的是,如果未在链接描述文件中分配.bar,则构建将成功成功,并且foo将作为初始化数据存在于RAM中(常量初始值当然也会加上FLASH的大小)。令人讨厌的部分是,当该节不存在时,链接器不会抱怨,因此,如果期望数据驻留在FLASH中,它可能会默默地驻留在RAM中的非固定位置。如果发生这种情况,是否有编译/链接器选项来强制失败?

1 个答案:

答案 0 :(得分:1)

根据GNU ld documentation,可以使用if rand not in list: lis.append(rand)命令行选项告诉ld将错误作为孤立链接器节来处理。

假设orphan.c确实包含以下代码:

if rand not in lis: lis.append(rand)

以下命令确实成功:

--orphan-handling=error

但是那确实失败了:

int foo __attribute__((section(".bar"))) = 5;

int main(void)
{
  return 0;
}

看来,我用于本示例的默认链接描述文件缺少另一节aarch64-elf-gcc --specs=rdimon.specs -o orphan orphan.c 。必须对其进行修复,以便在正确定义aarch64-elf-gcc --specs=rdimon.specs -Wl,--orphan-handling=error -o orphan orphan.c c:/git/cortex-baremetal/opt/gcc-linaro-7.3.1-2018.05-i686-mingw32_aarch64-elf/bin/../lib/gcc/aarch64-elf/7.3.1/../../../../aarch64-elf/bin/ld.exe: error: unplaced orphan section `.tm_clone_table' from `c:/git/cortex-baremetal/opt/gcc-linaro-7.3.1-2018.05-i686-mingw32_aarch64-elf/bin/../lib/gcc/aarch64-elf/7.3.1/crtbegin.o'. c:/git/cortex-baremetal/opt/gcc-linaro-7.3.1-2018.05-i686-mingw32_aarch64-elf/bin/../lib/gcc/aarch64-elf/7.3.1/../../../../aarch64-elf/bin/ld.exe: error: unplaced orphan section `.bar' from `C:\Users\user\AppData\Local\Temp\cc6aRct8.o'. c:/git/cortex-baremetal/opt/gcc-linaro-7.3.1-2018.05-i686-mingw32_aarch64-elf/bin/../lib/gcc/aarch64-elf/7.3.1/../../../../aarch64-elf/bin/ld.exe: error: unplaced orphan section `.tm_clone_table' from `c:/git/cortex-baremetal/opt/gcc-linaro-7.3.1-2018.05-i686-mingw32_aarch64-elf/bin/../lib/gcc/aarch64-elf/7.3.1/crtend.o'. 部分时不会触发错误。