编译器驱动程序
对于 .c 源文件,先用翻译器翻译为 .o 二进制文件,这个二进制文件被称为可重定位目标文件,静态链接器将 .o 文件结合起来生成一个完全链接的可执行文件。
静态链接
静态链接器执行两个基本操作:
- 符号解析
符号解析主要是为了解决全局变量和函数、static 变量和函数的定义域有效性问题,汇编器会构造符号表并将符号的地址填入符号表。链接器将每个符号的引用(使用符号的位置)与一个符号的定义(定义该符号的符号目录)关联起来,即取找到这个符号对应的位置,例如找到全局函数的位置,或是确定全局变量的位置。
具体参见符号解析
- 重定位
把每个符号的定义与一个内存位置关联起来,从而重定位这些节。
具体见重定位
链接器的重要工作是将字节块链接起来,确定被连接块的运行时位置。
目标文件
可重定位目标文件
就是上文所说的,由翻译器翻译的目标文件。
具体的ELF可重定位目标文件节见书 P.467,这里介绍四个重要的节:
- .text
已编译的机器码
- .data
已初始化的全局和静态 C 变量。(其中局部变量保存在栈中,由栈指针管理)
- .bss
未初始化或初始化为 0 的全局变量和静态 C 变量,这个节不占据空间。在目标文件中,未初始变量不需要占据任何实际的磁盘空间,运行时,在内存中分配这些变量,初始值为 0。
- .symtab
符号表,包含定义及引用的全局函数和全局变量的信息。
可执行目标文件
这是由链接器生成的,为可执行文件。
共享目标文件
可以在加载或运行时被动态地加载进内存并链接。