映射结构是基于 ELF 的链接编辑器中最重要的数据结构之一。对应于模型缺省 mapfile 的缺省映射结构由链接编辑器使用。任何用户 mapfile 都可以增大或覆盖缺省映射结构中的特定值。
图 E-1 说明了一个典型但某种程度上已简化的映射结构。“入口条件”框对应于缺省映射指令中的信息。“段属性描述符”框对应于缺省段声明中的信息。“输出节描述符”框提供了每段下的各个节的详细属性。节本身以循环方式显示。
图 E-1 简单的映射结构
将节映射到段时,链接编辑器执行以下步骤:
读入节时,链接编辑器会检查入口条件列表以查看是否存在匹配。必须匹配所有指定的条件。
在图 E-1 中,text 段下节的 section_type 值必须为 $PROGBITS,section_flags 值必须为 ?A!W。此节的名称无需为 .text,因为入口条件中未指定任何名称。节的 section_flag 值可以是 X,也可以是 !X,因为入口条件中未指定任何执行位。
如果不与任何入口条件匹配,则将节放置在输出文件的末尾(位于所有其他段之后)。不会为此信息创建任何程序头项。
当节位于段下时,链接编辑器会检查此段中现有输出节描述符的列表,方式如下:
如果节属性值与现有输出节描述符的属性值完全匹配,则将此节放置在与该输出节描述符关联的节列表的末尾。
例如,section_name 值为 .data1、section_type 值为 $PROGBITS、section_flags 值为 ?AWX 的节将进入图 E-1 中第二个“入口条件”框,可以将其放置在 data 段中。此节与第二个“输出节描述符”框 (.data1, $PROGBITS, ?AWX) 完全匹配,将被添加到与该框关联的列表的末尾。fido.o、rover.o 和 sam.o 中的 .data1 节说明了这一点。
如果未找到匹配的输出节描述符,但是存在其他具有相同 section_type 的输出节描述符,则使用与节相同的属性值创建一个新的输出节描述符,并且此节与新的输出节描述符相关联。输出节描述符和节放置在节类型相同的最后一个输出节描述符之后。图 E-1 中的 .data2 节便是按照此方式放置的。
如果不存在其他具有所示节类型的输出节描述符,则将创建一个新的输出节描述符,并将节放置在此节中。
注 - 如果输入节的用户定义类型值介于 SHT_LOUSER 和 SHT_HIUSER 之间,则将其视为 $PROGBITS 节。mapfile 中没有命名此 sec ion_ty e 值的方法,但是可以使用入口条件中的其他属性值规 (section_flags、 sect on_name) 重定向这些节。
如果在读取所有命令行目标文件和库之后,段中没有任何节,则不会为该段生成任何程序头项。
注 - 类型为 $SYMTAB、$STRTAB、$REL 和 $RELA 的输入节由链接编辑器在内部使用。引用这些节类型的指令只能将链接编辑器生成的输出节映射到段。