可重定位目标文件(.o 文件)

包含的代码和数据,其形式能与其他可重定位目标文件相结合,以形成可执行的目标文件

每一个.o 文件是由一个源 (.c)文件生成的
它(目标文件)纯粹是字节块的集合
这些块中,有些包含程序代码,有些包含程序数据,而其他的则包含引导链接器和加载器的数据结构,这些块中,有些包含程序代码,有些包含程序数据,而其他的则包含引导链接器和加载器的数据结构
链接器将这些块连接起来,确定被连接块的运行时位置,并且修改代码和数据块中的各种位置

由不同的代码和数据节(section)组成,每一都是一个连续的字符序列
指令在一节中,初始化了的全局变量在另一节中,而未初始化的变量又在另外一节中

为了构造可执行文件,链接器必须完成两个主要任务:

  • 符号解析(symbol resolution)
    • 目标文件定义和引用符号
    • 每个符号对应于一个函数、一个全局变量或一个静态变量(即 C 语言中任何以 static 属性声明的变量)
    • 符号解析的目的是将每个符号引用正好和一个符号定义关联起来。
  • 重定位(relocation)
    • 编译器和汇编器生成从地址 0 开始的代码和数据节。
    • 链接器通过把每个符号定义与一个内存位置关联起来,从而重定位这些节,然后修改所有对这些符号的引用,使得它们指向这个内存位置
    • 链接器使用汇编器产生的重定位条目(relocation entry)的详细指令,不加甄别地执行这样的重定位。