Oracle® Solaris 11.2 链接程序和库指南

退出打印视图

更新时间: 2014 年 7 月
 
 

节到段的分配

将输入节分配给输出段的过程涉及以下数据结构。

  • 输入节

    输入节是从可重定位目标文件输入读入到链接编辑器中的。其中某些由链接编辑器检查和处理,另一些则只是传递至输出而不检查其内容(例如 PROGBITS)。

  • 输出节

    输出节是写入到输出目标文件中的节。其中某些由通过输入目标文件传递的节串联而成。另一些(如符号表和重定位节)由链接编辑器自己生成,并且通常会并入从输入目标文件中读取的信息。

    当链接编辑器传递输入节以使之成为输出节时,该节通常会保留输入节名称。不过,链接编辑器在某些情况下会修改名称。例如,链接编辑器会转换 name%XXX 形式的输入节名称,在输出节名称中删除 % 字符及其后的任何字符。

  • 段描述符

    链接编辑器会维护一个已知段列表。该列表初始时包含预定义段,如预定义段中所述。当使用 LOAD_SEGMENTNOTE_SEGMENTNULL_SEGMENT mapfile 指令创建新段时,会向此列表中添加新段的附加段描述符。除非通过设置虚拟地址 (LOAD_SEGMENT) 或使用 SEGMENT_ORDER 指令进行显式排序,否则新段将位于列表的末尾(位于相同类型的其他段之后)。

    创建输出目标文件时,链接编辑器只会为接收节的段创建程序头。将以无提示方式忽略空段。因此,用户指定的段定义可完全取代预定义的段定义的使用,尽管没有明确的工具用于从链接编辑器列表中删除段定义。

  • 入口条件

    为将节放入给定段中所需的一组节属性称为该段的入口条件。给定段可以具有任意数量的入口条件。

    链接编辑器会维护一个所有定义的入口条件的内部列表。该列表用于将节放入段中,如下所述。每个 mapfile 按照在 mapfile 中遇到 ASSIGN_SECTION 属性所创建的入口条件的顺序将它们插入到此列表顶部的 LOAD_SEGMENTNOTE_SEGMENTNULL_SEGMENT mapfile 指令中。预定义段中所讨论的内置段的入口条件放在此列表的最后。因此,mapfile 定义的入口条件将优先于内置规则,而位于命令行最后的 mapfile 将优先于开始处的 mapfile。

对于写入到输出目标文件中的每个节,链接编辑器将执行以下步骤,以便将节放入输出段中。

  1. 节的属性将与内部入口条件列表中的每个记录进行比较,从列表的开头开始,依次考虑每个入口条件。当入口条件中的每个属性都精确匹配时,则表示匹配,并且不会禁用与该入口条件相关联的段。搜索将在匹配的第一个入口条件处停止,并且节将定向到关联的段。

    如果不与任何入口条件匹配,则将节放置在输出文件的末尾(位于所有其他段之后)。不会为此信息创建任何程序头项。多数不可分配节(例如调试节)都结束于此区域。

  2. 当节位于段下时,链接编辑器会检查此段中现有输出节的列表,方式如下:

    如果节属性值与现有输出节的属性值完全匹配,则将此节放置在与该输出节关联的节列表的末尾。

    如果未找到匹配的输出节,则使用要放置的节的属性创建一个新输出节,并将输入节放在新输出节中。此新输出节位于段内具有相同节类型的任何其他输出节之后,如果没有相同类型的其他输出节,则位于段的末尾。


    注 - 如果输入节的用户定义的节类型值介于 SHT_LOUSERSHT_HIUSER 之间,则将其视为 PROGBITS 节。没有在 mapfile 中命名此节类型值的方法,但可以使用入口条件中指定的其他属性值(节标志、节名称)重定向这些节。