可重定位的输出

在 GCC 中,-c 让流程在生成目标文件后停止,不执行链接;-S 则停在汇编代码输出。常见的 .o 后缀反映工具惯例,不能替代对文件格式和目标架构的识别。

目标文件可以带有已经生成的机器代码,同时仍有地址尚未最终确定。它不是因为缺少机器指令才需要链接,而是还要把多个部分的定义、引用和布局结合起来。

参考:[1] [2]

代码之外的记录

ELF 的文件头记录类型和体系结构等信息,节表描述文件各部分。符号表为名字的定义和引用提供线索;重定位记录指出哪些位置需要调整,以及应使用的符号和重定位类型。

代码、已初始化数据、未初始化存储需求和调试资料可以分别描述。.bss 这样的节表达运行时所需空间,并不要求文件为每一个将来置零的字节保存一份零值。

参考:[2]

目标模块与程序映像

Windows 的 COFF 目标模块与 PE 程序映像也有不同布局。目标模块包含 COFF 头、节以及相应的原始数据和重定位信息;映像还具有装载运行所需的头部和目录。

因此,目标文件、共享库和可执行文件虽然可能共享某些格式家族,仍有不同用途。跨平台搬运时,处理器指令集一致也不足以保证兼容,还要匹配文件格式、重定位规则和二进制接口。

参考:[3]