1. 预编译:
预编译过程主要处理那些源代码文件中的以“#
”开始的预编译指令。
比如“#include
”“#define
”等。
主要处理规则如下:
(1)展开所有的宏
(2)处理所有的条件编译指令
(3)处理预编译指令,将被包含的文件递归插入到该预编译指令的位置
(4)删除所有的注释
(5)添加行号和文件名标识,以便编译器产生错误信息
(6)保留所有的“#pragma
”编译器指令
$ gcc -E hello.c -o hello.i
<u></u>-E
表示只进行预编译
2. 编译:
编译就是把预处理完的文件,进行一系列词法分析,语法分析,语义分析及优化后生成相应的汇编代码文件。
$ gcc -S hello.i -o hello.s
3. 汇编:
汇编器是将汇编代码转变成机器可以执行的指令,每一个汇编语句几乎都对应一条机器指令。
$ gcc -c hello.s -o hello.o
4. 链接:
一个复杂的软件,每个源代码模块独立编译,然后按需将它们组装起来,这个组装模块的过程就是链接。
链接过程主要包括:
(1)地址和空间分配(Address and Storage Allocation)
(2)符号决议(Symbol Resolution)
(3)重定位(Relocation)
每个模块的源代码文件(.c
文件)经过编译器编译成目标文件(.o
文件),目标文件和库一起链接形成最终可执行文件。