链接程序和库指南

内部映射结构

映射结构是基于 ELF 的链接编辑器中最重要的数据结构之一。对应于模型缺省 mapfile 的缺省映射结构由链接编辑器使用。任何用户 mapfile 都可以增大或覆盖缺省映射结构中的特定值。

图 9–1 展示了一个典型但某种程度上已简化的映射结构。“入口条件”框对应于缺省映射指令中的信息。“段属性描述符”框对应于缺省段声明中的信息。“输出节描述符”框提供了每段下的各个节的详细属性。循环显示节本身。

图 9–1 简单的映射结构

简化的映射结构。

将节映射到段时,链接编辑器执行以下步骤:

  1. 读入节时,链接编辑器会检查入口条件列表以查看是否匹配。必须与所有指定的条件相匹配。

    图 9–1 中,text 段下节的 section_type 值必须为 $PROGBITSsection_flags 值必须为 ?A!W。此节的名称无需为 .text,因为入口条件中未指定任何名称。节的 section_flags 值可以是 X,也可以是 !X,因为入口条件中未指定任何执行位。

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

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

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

    例如,section_name 值为 .data1section_type 值为 $PROGBITSsection_flags 值为 ?AWX 的节将进入图 9–1 中第二个“入口条件”框,可以将其放置在 data 段中。此节与第二个“输出节描述符”框(.data1$PROGBITS?AWX)完全匹配,并将被添加到与该框关联的列表的末尾。fido.orover.osam.o 中的 .data1 节说明了这一点。

    如果未找到匹配的输出节描述符,但是存在其他具有相同 section_type 的输出节描述符,则使用与节相同的属性值创建新的输出节描述符,并且此节与新的输出节描述符相关联。输出节描述符和节放置在相同节类型的最后一个输出节描述符之后。图 9–1 中的 .data2 节便是按照此方式放置的。

    如果不存在其他具有所示节类型的输出节描述符,则创建新的输出节描述符,并将节放置在此节中。


    注 –

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


  3. 如果在读取所有命令行目标文件和库之后,段中没有任何节,则不会为此段生成任何程序头项。


注 –

类型为 $SYMTAB$STRTAB$REL$RELA 的输入节由链接编辑器在内部使用。引用这些节类型的指令只能将链接编辑器生成的输出节映射到段。