在完成输入文件处理和符号解析并且没有出现致命错误后,链接编辑器将生成输出文件。链接编辑器首先生成完成输出文件必需的其他节。这些节包括所有输入文件中的符号表,这些符号表包含局部符号定义以及已解析的全局符号和弱符号信息。
此外,还包括运行时链接程序需要的任何输出重定位和动态信息节。确定所有输出节信息后,将计算输出文件总大小。然后,相应地创建输出文件映像。
创建动态可执行文件或共享目标文件时,通常会生成两个符号表。.dynsym 表及其关联的字符串表 .dynstr 包含寄存器符号、全局符号、弱符号和节符号。这些节成为在运行时作为进程映像一部分映射的 text 段的一部分。请参见 mmapobj(2)。使用此映射,运行时链接程序可以读取这些节,以便执行任何必需的重定位。
.symtab 表及其关联的字符串表 .strtab 包含在输入文件处理过程中收集的所有符号。这些节不能作为进程映像的一部分进行映射。使用链接编辑器的 –z strip-class 选项,或者在链接编辑器之后使用 strip(1),可以将这些节从映像中剥离。
生成符号表期间,将创建保留符号。这些符号对于链接进程有特殊意义。不能在代码中定义这些符号。
对链接编辑器提供的地址表(即 .got 节)的引用,与位置无关。此表由与位置无关的数据引用构造而成,这些数据引用出现在使用 –K pic 选项编译的目标文件中。请参见与位置无关的代码。
对链接编辑器提供的地址表(即 .plt 节)的引用,与位置无关。此表由与位置无关的函数引用构造而成,这些数据引用出现在已使用 –K pic 选项编译的目标文件中。请参见与位置无关的代码。
生成可执行文件时,链接编辑器将查找其他符号,以定义可执行文件的入口点。如果使用链接编辑器的 –e 选项指定了一个符号,那么将使用该符号。否则,链接编辑器会查找保留符号名称 _start,然后查找 main。