GNU 链接器 - 孤立部分和符号分配

2024-04-28

在阅读了足够多有关 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(使用前将#替换为@)

GNU 链接器 - 孤立部分和符号分配 的相关文章

随机推荐