使用用于arm微控制器的arm-none-eabi-gcc编译器工具链,并在FLASH
中定义此foo
变量所在的特定部分。
假设我有示例定义:
int foo __attribute__((section(".bar"))) = 5;
我观察到的是,如果未在链接描述文件中分配.bar
,则构建将成功成功,并且foo
将作为初始化数据存在于RAM
中(常量初始值当然也会加上FLASH
的大小)。令人讨厌的部分是,当该节不存在时,链接器不会抱怨,因此,如果期望数据驻留在FLASH
中,它可能会默默地驻留在RAM
中的非固定位置。如果发生这种情况,是否有编译/链接器选项来强制失败?
答案 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'.
部分时不会触发错误。