将节注入 GNU ld 脚本; binutils 版本之间的脚本兼容性。

发布于 2024-11-26 19:23:21 字数 860 浏览 1 评论 0原文

我正在构建类似问题 如何将不同 .a 文件中的数据收集到一个数组中?如何使用 ld 脚本保留 .a 文件中的部分?,即在链接期间由来自不同目标文件的元素组成的数组。

就我而言,有多个数组,每个数组都有自己的部分 .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 节中?

I'm building something like in the question How to collect data from different .a files into one array? How to keep sections in .a files with ld script?, i.e. arrays composed during link-time out of elements from different object files.

In my case, there are several arrays, each one going into its own section, .ld_comp_array_*, where * matches the name of the array. Then I take the default linker script using ld --verbose and modify it by putting all these sections (sorted, so that elements of different arrays don't get mixed) into an output section:

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

and everything works fine.

Then things get a tiny bit more complicated, because application(s) using this feature may be built for various platforms - so far, I've successfully tried AVR Xmega as target platform, as well as Windows 32-bit and Linux 32- and 64-bit for unit testing, and the list is open (new platforms are likely to be added in near future).

However, for each particular platform the default linker scripts is different than on other platforms, and currently I insert the .ld_comp_array* sections manually - would it be possible to do it somehow automatically? The only solution I thought of was parsing the default script and pasting the above input section description, but this seems way too heavy.

I could keep it done manually if there's no relatively simple solution, but I'm not sure if the default scripts obtained from a local version of ld may break on different version of binutils. Can anyone clarify whether this is safe or not?

In case it can be done automatically, is it ok to "inject" the input section specification always directly into .text section, assuming arrays are supposed to be "immutable"?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

瑶笙 2024-12-03 19:23:21

我为这个问题找到了一个令人满意的解决方案。 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

I found a satisfying solution for that problem. GNU ld has the INSERT option which makes the externally supported script not override the default script, but simply add new section at position relative to some section that exists in the default script.

So in my case, the script passed to the linker may be as simple as:

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

More on the INSERT option: http://sourceware.org/binutils/docs/ld/Miscellaneous-Commands.html#Miscellaneous-Commands

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文