【问题标题】:Injecting sections into GNU ld script; script compatibility between versions of binutils.将部分注入 GNU ld 脚本; binutils 版本之间的脚本兼容性。
【发布时间】:2011-10-16 05:10:10
【问题描述】:

我正在构建类似于问题How to collect data from different .a files into one array? How to keep sections in .a files with ld script? 的东西,即在链接时由来自不同目标文件的元素组成的数组。

在我的例子中,有几个数组,每个数组都有自己的部分,.ld_comp_array_*,其中 * 与数组的名称匹配。然后我使用 ld --verbose 获取默认链接器脚本,并通过将所有这些部分(已排序,以便不同数组的元素不会混合)放入输出部分来修改它:

KEEP (*(SORT_BY_NAME(.ld_comp_array*)))

一切正常。

然后事情变得有点复杂,因为使用此功能的应用程序可能会为各种平台构建 - 到目前为止,我已经成功尝试将 AVR Xmega 作为目标平台,以及 Windows 32 位和 Linux用于单元测试的 32 位和 64 位,并且列表是开放的(可能会在不久的将来添加新平台)。

但是,对于每个特定平台,默认链接器脚本与其他平台上的不同,目前我手动插入 .ld_comp_array* 部分 - 是否有可能以某种方式自动完成?我想到的唯一解决方案是解析默认脚本并粘贴上面的输入部分描述,但这似乎太重了。

如果没有相对简单的解决方案,我可以手动完成,但我不确定从本地版本的 ld 获得的默认脚本是否会在不同版本的 binutils 上中断。谁能澄清这是否安全?

如果它可以自动完成,假设数组应该是“不可变的”,是否可以将输入节规范始终直接“注入”到 .text 节中?

【问题讨论】:

    标签: c linker ld binutils


    【解决方案1】:

    我为这个问题找到了一个令人满意的解决方案。 GNU ld 具有 INSERT 选项,它使外部支持的脚本不会覆盖默认脚本,而只是在相对于默认脚本中存在的某个部分的位置添加新部分。

    所以在我的例子中,传递给链接器的脚本可能很简单:

    SECTIONS
    {
      .rodata.ld_comp_array :
      {
        *(SORT_BY_NAME(.ld_comp_array*))
      }
    }
    INSERT AFTER .rodata;
    

    更多关于 INSERT 选项:http://sourceware.org/binutils/docs/ld/Miscellaneous-Commands.html#Miscellaneous-Commands

    【讨论】:

      猜你喜欢
      • 2019-04-29
      • 1970-01-01
      • 2013-10-07
      • 2016-02-13
      • 1970-01-01
      • 2019-01-12
      • 1970-01-01
      • 2020-09-09
      • 1970-01-01
      相关资源
      最近更新 更多