现代编译过程
编译过程分为五步:
- 扫描解析文件
- 预处理工作
处理宏定义,不管是由-D参数指定,还是在源码内部通过#define,或者使用了标准库,扩展库中的宏,都会替换为定义的值。 命令:
cpp
输出的a.i就是预处理过的文件,包含了完整的内容。
a.c>a.i
由此可以得出,宏不是运行时的定义内容,也不是编译时的内容,而是预处理阶段就完成的。
- 编译阶段:
将源代码(也就是预处理过的代码)编译为特定机器的汇编语言。 命令:
gcc -S -Wall a.i
输出为特定的汇编内容。
- 汇编阶段:
将汇编源码汇编为机器码内容。 命令:
as a.s -o a.o
此处如果有对外部的函数使用,则会预留未定义的地址,以供最后一步链接来使用。
- 链接阶段:
将链接对象文件(上编译汇编后的文件)链接为可执行文件,此过程比较复杂,需要链接很多外部的库文件,包括静态的,动态的库。 命令:
ld
可以使用
-dynamic-linker .. .. ..gcc a.o
来简化上一过程。 最后得出的是可执行文件。