GNU链接器 - 孤立的部分和符号赋值

时间:2018-03-04 11:58:18

标签: gcc linker ld

在阅读了关于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符号中产生不需要的值?

1 个答案:

答案 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

因此,似乎应该编辑带有符号赋值示例和解释的文档,以提及孤立部分或删除。