epi*_*pij 13 c linker ld binutils
我正在构建类似于如何将来自不同.a文件的数据收集到一个数组中的问题?如何使用ld脚本保留.a文件中的节?,即在链接时组成的数组,来自不同目标文件的元素.
在我的例子中,有几个数组,每个数组都进入它自己的部分,.ld_comp_array_*,其中*匹配数组的名称.然后我使用ld --verbose获取默认链接描述文件,并通过将所有这些部分(排序,以便不同数组的元素不混合)修改为输出部分来修改它:
KEEP (*(SORT_BY_NAME(.ld_comp_array*)))
Run Code Online (Sandbox Code Playgroud)
一切正常.
事情变得有点复杂,因为使用这个功能的应用程序可以为各种平台构建 - 到目前为止,我已成功尝试AVR Xmega作为目标平台,以及Windows 32位和Linux 32-和64位用于单元测试,列表是开放的(新平台很可能在不久的将来添加).
但是,对于每个特定平台,默认链接器脚本与其他平台上的不同,目前我手动插入.ld_comp_array*部分 - 是否可以以某种方式自动执行?我想到的唯一解决方案是解析默认脚本并粘贴上面的输入节描述,但这看起来太沉重了.
如果没有相对简单的解决方案,我可以手动完成它,但我不确定从本地版本的ld获得的默认脚本是否可能在不同版本的binutils上中断.任何人都可以澄清这是否安全?
如果它可以自动完成,是否可以将输入节规范"直接"注入到.text部分,假设数组应该是"不可变的"?
epi*_*pij 18
我找到了一个令人满意的解决方案.GNU ld具有INSERT选项,该选项使外部支持的脚本不会覆盖默认脚本,而只是在相对于默认脚本中存在的某个部分的位置添加新部分.
所以在我的例子中,传递给链接器的脚本可能很简单:
SECTIONS
{
.rodata.ld_comp_array :
{
*(SORT_BY_NAME(.ld_comp_array*))
}
}
INSERT AFTER .rodata;
Run Code Online (Sandbox Code Playgroud)
有关INSERT选项的更多信息:http://sourceware.org/binutils/docs/ld/Miscellaneous-Commands.html#Miscellaneous-Commands
| 归档时间: |
|
| 查看次数: |
4013 次 |
| 最近记录: |