在阅读了足够多有关 GNU 链接器的文档后,我对结合有关实现自定义链接器文件的两个不同概念感到困惑。
第一个概念是孤儿节 https://sourceware.org/binutils/docs/ld/Orphan-Sections.html#Orphan-Sections-
如果没有名称匹配的输出节将创建新的输出部分。每个新的输出节将与其中放置的孤立节具有相同的名称。如果有多个同名的孤立节,这些将被合并到一个新的输出节中。
如果创建新的输出节来保存孤立的输入节,
那么链接器必须决定将这些新的输出节放置在哪里
与现有输出部分相关。在大多数现代目标上,
链接器尝试将孤立部分放置在相同的部分之后
属性,例如代码与数据、可加载与不可加载等。如果不
找到具有匹配属性的部分,或者您的目标缺少此属性
支持,孤立部分放置在文件末尾。
第二个概念是关于符号分配 https://sourceware.org/binutils/docs/ld/Simple-Assignments.html-
这是一个示例,显示了该符号的三个不同位置
可以使用赋值:
floating_point = 0;
SECTIONS
{
.text :
{
*(.text)
_etext = .;
}
_bdata = (. + 3) & ~ 3;
.data : { *(.data) }
}
在此示例中,符号“floating_point”将被定义为零。
符号“_etext”将被定义为最后一个之后的地址
‘.text’输入部分。符号‘_bdata’将被定义为
“.text”输出节之后的地址向上对齐到 4
字节边界。
So, the bold关于孤立部分的解释表明,在上面的示例中,链接器可能会在之后放置另一个输出部分.text
输出部分,这意味着bold符号分配说明中的文本是错误的。
那么,这个例子是否会产生不需要的值?_bdata
符号中是否存在孤儿节?
答案发现于源软件LD文档里面地点柜台 https://sourceware.org/binutils/docs/ld/Location-Counter.html#Location-Counter章节-
将符号设置为位置计数器外部的值
如果链接器输出节语句可能会导致意外的值
需要放置孤立部分.
SECTIONS {
start_of_text = . ;
.text: { *(.text) }
end_of_text = . ;
start_of_data = . ;
.rodata: { *(.rodata) }
.data: { *(.data) }
end_of_data = . ; }
这可能是脚本作者的意图,也可能不是
数据开始.
因此,似乎应该编辑带有符号分配示例和解释的文档以提及孤立部分,或者删除它们。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)