在阅读了关于GNU链接器的足够文档之后,我对组合关于实现自定义链接器文件的两个不同概念感到困惑。
第一个概念是orphan sections -
如果没有匹配名称的输出部分,则将创建新的输出部分。每个新输出部分的名称与放置在其中的孤立部分相同。 如果有多个具有相同名称的孤立部分,则这些部分将合并为一个新的输出部分。 如果创建新的输出节以保存孤立的输入节, 然后链接器必须决定放置这些新输出节的位置 与现有的输出部分有关。 在大多数现代目标上, 链接器尝试在孤立的部分之后放置孤立部分 属性,例如代码与数据,可加载与不可加载等。如果不 找到具有匹配属性的部分,或者您的目标缺少此部分 支持,孤儿部分放在文件的末尾。
第二个概念是关于symbol assignment -
这是一个显示符号的三个不同位置的示例 可以使用作业:
floating_point = 0;
SECTIONS
{
.text :
{
*(.text)
_etext = .;
}
_bdata = (. + 3) & ~ 3;
.data : { *(.data) }
}
在此示例中,符号“floating_point”将定义为零。 符号'_etext'将被定义为最后一个地址 '.text'输入部分。 符号'_bdata'将被定义为 '.text'输出部分后面的地址向上对齐到4 字节边界。
因此,关于孤立部分的粗体说明有可能在上面的示例中,链接器将在.text
输出部分之后放置另一个输出部分,这意味着粗体文本错误。
那么,如果此中存在孤立部分,此示例是否会在_bdata
符号中产生不需要的值?
答案 0 :(得分:0)
在The Location Counter章节中的 Sourceware LD文档中找到答案 -
将符号设置为位置计数器的值 如果链接器,输出节语句可能会导致意外的值 需要放置孤儿部分。
SECTIONS {
start_of_text = . ;
.text: { *(.text) }
end_of_text = . ;
start_of_data = . ;
.rodata: { *(.rodata) }
.data: { *(.data) }
end_of_data = . ; }
这可能是也可能不是脚本作者对值的意图 start_of_data 强>
因此,似乎应该编辑带有符号赋值示例和解释的文档,以提及孤立部分或删除。