如何正确避免未为“ .ARM.exidx”部分设置sh_link的警告?

问题描述 投票:3回答:1

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

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

警告不见了。有什么区别?由于我会自动生成链接描述文件,因此,我确实希望在该部分中使用符号-上一节中使用的内存区域(此处为“闪存”)没有区别。

有趣的是,另一种适用于自动生成的“通用”方法给出了完全相同的警告:

.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个回答
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

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

© www.soinside.com 2019 - 2024. All rights reserved.