一个.c文件变成可执行文件,一共经历了以下几个过程:
预编译,编译,汇编,链接。
预编译阶段(预编译之后生成.i文件)主要处理那些源代码文件中以“#”开始的预编译指令,例如#include,#define等。主要规则如下:
- 1,删除所有的#define,展开所有的宏定义;
- 2,处理所有的条件预编译指令,如#if,#ifdef,#elif,#else,#endif
- 3,处理#include预编译指令,将被包含的文件插入到该预编译指令的位置(该过程是递归进行的);
- 4,删除所有的注释(实际上是被替换为一个空格);
- 5,添加行号和文件名标识;
- 6,保留所有的#pragma编译器指令
编译过程(编译之后生成.s文件)将预处理完的文件进行一系列的词法分析,语法分析,语义分析以及优化产生相应的汇编代码文件。
汇编过程(汇编之后生成.o文件)将汇编代码转化成机器可以识别的指令;
链接过程的主要内容是把各个模块之间相互引用的部分都处理好,使得各个模块之间可以正常的拼接,包括以下三个部分:
- 1,地址和空间的分配;
- 2,符号决议;
- 3,重定位;