如果在我的链接描述文件中,我有这个:
.ARM.exidx :
{
. = ALIGN(4);
PROVIDE(__exidx_start = .);
*(.ARM.exidx* .gnu.linkonce.armexidx.*);
. = ALIGN(4);
PROVIDE(__exidx_end = .);
} > rom AT > rom
我在构建项目时收到以下警告:
/home/freddie/arm-none-eabi-gcc-7.1.0-170503/bin/../lib/gcc/arm-none-eabi/7.1.0/../../../../arm-none-eabi/bin/ld: output/./application.elf: warning: sh_link not set for section `.ARM.exidx'
所以我将符号“移出”该部分:
. = ALIGN(4);
PROVIDE(__exidx_start = .);
.ARM.exidx :
{
*(.ARM.exidx* .gnu.linkonce.armexidx.*);
} > rom AT > rom
. = ALIGN(4);
PROVIDE(__exidx_end = .);
警告消失了......有什么区别?由于我自动生成链接描述文件,我真的更喜欢将符号放在该部分中 - 然后在上一节中使用的内存区域(此处为“flash”)没有区别。
有趣的是,另一种适用于自动生成的“通用”方法给出了完全相同的警告:
.ARM.exidx :
{
*(.ARM.exidx* .gnu.linkonce.armexidx.*);
} > rom AT > rom
PROVIDE(__exidx_start = ADDR(.ARM.exidx));
PROVIDE(__exidx_end = ADDR(.ARM.exidx) + SIZEOF(.ARM.exidx));
答案 0 :(得分:0)
我通过更改解决了该问题:
.ARM.exidx :
{
__exidx_start = .;
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
__exidx_end = .;
. = ALIGN(4);
} > FLASH
收件人:
.ARM :
{
__exidx_start = .;
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
__exidx_end = .;
. = ALIGN(4);
} > FLASH
我认为这可行,因为某些魔术输出节名称会自动设置一些标志。