15

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

4

2 回答 2

26

我认为这些选项会做你想要的:

-Wl,--build-id=none

为 style 传递 none 会禁用命令行前面任何 --build-id 选项的设置。

ld 手册

于 2013-03-09T22:06:05.407 回答
4

这是一篇旧帖子,但值得为后代说明您不必丢弃构建 ID。您的替代方法是通过编辑链接描述文件将其移动到闪存的另一个区域。

只需将构建 ID 移动到文本部分中矢量表之后的某个位置:

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

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

于 2019-05-02T21:46:28.003 回答