编译驱动程序(compiler driver)
这代表用户在需要时调用语言预处理器、编译器、汇编器和链接器。
预处理器 cpp
c编译器 cc1
汇编器 as
链接器 ld
值得留意得是驱动程序经过相同的程序生成xxx.o,最后,它运行链接器程序ld,将main.o文件和xxx.o以及一些必要的系统目标文件组合起来,创建一个可执行目标文件。
像unix ld这样的静态链接器(static linker)以一组可重定位目标文件和命令行参数作为输入,生成一个完全链接的可以加载和运行的可执行目标文件作为输出。输入的可重定位目标文件由各种不同的代码和数据节(section)组成。指令在一个节中,初始化的全局变量在另一个节中,而未初始化的变量在另外一个节中。
unix> ./p
再次铺垫下,外壳调用操作系统中一个叫做加载器的函数,它拷贝可执行文件p中的代码和数据到存储器,然后将控制转移到这个程序的开头。
目标文件纯属字节块的组合。在这些块中,有些包含程序代码,有些则包含程序数据,而其他的则包含指导链接器和加载器的数据结构。链接器将这些块连接起来,确定被连接块的运行时位置, 并且修改代码和数据块中的各种位置。
目标文件
- 可重定位目标文件
- 可执行目标文件
- 共享目标文件
编译器和汇编器生成可重定位的目标文件(包括共享目标文件)。
链接器生成可执行目标文件。
目标文件的格式:
System V Unix | (COFF)Common Object File Format |
Windows NT | (PE)Portable Executable |
Unix(如Linux, System V Unix后来的版本,各种 BSD Unix等) | (ELF)Executable and Linkable Format |
以下是一个ELF格式的可重定位目标文件:
以下两个主题暂时跳过。
- 符号和符号表
- 符号解析
与静态库链接
在Unix系统中,静态库以一种称为存档(archive)的特殊文件格式存放在磁盘中。
存档文件是由一组连接起来的可重定位目标文件组合,有一个头部用来描述每个成员目标文件的大小和位置。
存档文件名由后缀.a标识。
to be continued ...
时间: 2024-10-13 14:40:57