【问题标题】:Do not pass --build-id to linker from gcc不要将 --build-id 从 gcc 传递给链接器
【发布时间】:2013-03-09 21:59:19
【问题描述】:

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

【问题讨论】:

  • 如果您想从gcc 传递链接器选项,可以使用-Wl,<LINKER_OPTION>。你问的是这个吗?
  • 您也可以随时使用--remove-section 选项来代替objcopy
  • 或者您可以将构建 ID 粘贴到开始以外的其他位置,如果它最终可能有用的话。

标签: c gcc arm


【解决方案1】:

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

-Wl,--build-id=none

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

——ld manual

【讨论】:

  • 太棒了,谢谢 - 我看到 sha1/md5 哈希类型可用,但没有发现 none
【解决方案2】:

这是一篇旧帖子,但值得为后代说明您不必丢弃构建 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,这可能会派上用场!

【讨论】:

  • 如果您可以在部署代码后以某种方式与设备通信,那么您可能还需要添加一个指向 build-id 的符号,以便您可以从代码本身中读取它并将其送回进行诊断。 _build_id = .KEEP(*(.note.gnu.build-id)) 之后
猜你喜欢
  • 2013-12-22
  • 1970-01-01
  • 2023-04-08
  • 2021-05-07
  • 1970-01-01
  • 2019-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多