GNU Linker - 孤立的部分和符号赋值

问题描述 投票:0回答:1

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

gcc linker ld
1个回答
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值的意图,也可能不是。

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

© www.soinside.com 2019 - 2024. All rights reserved.