【问题标题】:How to properly avoid warning about sh_link not set for section ".ARM.exidx"?如何正确避免有关“.ARM.exidx”部分未设置 sh_link 的警告?
【发布时间】:2025-12-05 05:50:01
【问题描述】:

如果在我的链接器脚本中有这个:

.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));

【问题讨论】:

    标签: gcc arm ld binutils


    【解决方案1】:

    我通过更改解决了这个问题:

      .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
    

    我认为这是可行的,因为某些魔术输出部分名称会自动设置一些标志。

    【讨论】: