链接编辑过程根据一个或多个输入文件创建输出文件。输出文件的创建由提供给链接编辑器的选项和输入文件提供的输入节控制。
所有文件都以可执行链接格式 (Executable and Linking Format, ELF) 表示。有关 ELF 格式的完整说明,请参见第 12 章。为介绍该文件格式,需要先介绍两种 ELF 结构:节和段。
节是 ELF 文件中可以处理的不可分割的最小单元。段是节的集合,节表示可由 exec(2) 或运行时链接程序 ld.so.1(1) 映射到内存映像的最小独立单元。
虽然存在许多类型的 ELF 节,但就链接编辑阶段而言,所有节都可归为两种类别。
包含程序数据的节,程序数据的解释仅对应用程序有意义,这类数据包括程序指令 .text 以及关联的数据 .data 和 .bss 等等。
包含链接编辑信息的节,这类信息包括 .symtab 和 .strtab 中的符号表信息以及诸如 .rela.text 的重定位信息等等。
本质上,链接编辑器将程序数据节串联成输出文件。链接编辑器将解释链接编辑信息节,以便修改其他节。信息节还用于生成在后期处理输出文件时使用的新输出信息节。
以下对链接编辑器功能的简单细分介绍了本章中涵盖的主题。
对提供的所有选项进行验证和一致性检查。
将输入可重定位目标文件中具有相同特征的节串联起来,以在输出文件中形成新的节。串联的节又可与输出段关联。
处理可重定位目标文件和共享目标文件中的符号表信息,以便验证并将引用和其定义合并起来。在输出文件中生成新的符号表。
处理输入可重定位目标文件中的重定位信息,并将此信息应用于构成输出文件的节。此外,还可以生成输出重定位节以供运行时链接程序使用。
生成用于描述所创建的所有段的程序头。
必要时生成动态链接信息节,这些节为运行时链接程序提供信息,如共享目标文件依赖项和符号绑定。
将类似的节串联起来以及将节关联到段的处理是在链接编辑器中使用缺省信息完成的。对于大多数链接编辑操作来说,链接编辑器提供的缺省节和段处理通常已满足要求。不过,可将 -M 选项与关联的 mapfile 配合使用来处理这些缺省行为。请参见附录 B。