不要将--build-id从gcc传递给链接器

时间:2013-03-09 21:59:19

标签: c gcc arm

我正在尝试使用gcc-arm-linux-gnueabi-nostdlib编译嵌入式arm处理器,以删除对c库和启动文件的依赖关系。该芯片没有任何解释elf文件的方法,因此使用objcopy -O binary,我可以从中删除elf标头。但是,如果我保留构建ID,则二进制文件在输出的开头具有构建ID,因此无法运行。我可以使用/DISCARD/ : { *(.note.gnu.build-id) *(.ARM.attributes) }删除链接描述文件中的构建ID,但是链接器会警告.note.gnu.build-id section discarded, --build-id ignored.。虽然这很好,并且代码在芯片上运行良好,但我不想传递然后删除构建ID。有没有办法指示gcc将命令传递给链接器而不传递--build-id

2 个答案:

答案 0 :(得分:17)

我认为这些选项可以满足您的需求:

-Wl,--build-id=none
  

为样式传递none会禁用先前命令行上任何--build-id选项的设置。

- ld manual

答案 1 :(得分:0)

这是一篇过时的文章,但值得一提的是,您不必丢弃构建ID。您可以选择通过编辑链接描述文件将其移至Flash的另一个区域。

只需将构建ID移到文本部分中向量表之后的某个位置即可

    .text :
    {
        . = ALIGN(4);
        _stext = .;
        KEEP(*(.vectors .vectors.*))
        KEEP(*(.note.gnu.build-id))
        *(.text .text.*)
        *(.rodata .rodata*)
        . = ALIGN(4);
        _etext = .;
    } > rom

这会将向量表保留在地址0x0(您的MCU可能需要此地址),但也允许您从代码中读取构建ID,这可能会派上用场!