本章主要讲述了编译和链接。在Linux下,当我们使用GCC来编译Hello World程序时,上述过程可分为预编译,编译,汇编,链接。
第一步预编译的过程相当于如下命令 $gcc -E hello.c -o hello.i 预编译过程主要处理那些源代码文件中的以"#"开始的预编译指令。
第二步编译的过程就是把预处理的文件进行一系列词法分析,语法分析,语义分析,及优化后生产相应的汇编代码文件。上面的编译过程相当于如下命令:$gcc -S hello.i -o hello.s 。
第三步汇编的过程是将汇编代码转变成机器可以执行的指令。命令如下命令如下:$gcc -c hello.s -o hello.o 或者使用gcc命令从C源代码文件开始,经过预编译,编译和汇编直接输出目标文件 $gcc -c hello.c -o hello.o
第四步链接就是将一大堆文件链接起来才可以得到最终的可执行文件
接下来,让我们重点看看第二步编译的过程,可想而知这一步的重要性了。从最直观的角度来讲,编译器就是将高级语言翻译成机器语言的一个工具。编译过程一般可以分为六步:扫描,语法分析,语义分析,源代码优化,代码生成和目标代码优化。有兴趣的小伙伴可以自行查阅了解。
接下来讲一讲链接,链接就是把各个模块之间相互引用的部分都处理好,使得各个模块之间能够正确的链接。最基本的静态链接的过程如下图所示
即每个模块的源代码文件经过编译器编译成目标文件,目标文件和库一起链接形成最终的可执行文件。此外,链接过程中还会有一个重定位的过程,就是在编译器不知道变量的目标地址时会将其地址置为零,之后再由链接器将真正的地址填进。