一、编译
1、预编译:
由c语言举例,一段代码,在经过预编译阶段后,由 .c 文件生成 .i 文件。预编译阶段主要处理源代码中以“#”开始 的预编译指令,例如:“ #include ” “ #define ”等。具体过程如下:
- 将所有的“ #define ”删除,并且展开所有的宏定义,进行宏替换。
- 处理所有的条件预编译指令,比如“ #if ”、“ #ifdef ”、“ #elif ”、“ #else ”、“ #endif ”。
- 处理“ #include ”预编译指令,将被包含的文件递归的展开,插入到该预编译指令的位置。
- 删除所有的注释
- 添加行号和文件名标识
经过预编译后的 .i 文件不包含任何宏定义!
2、编译:
一段C代码,在完成编译阶段后生成 .s 文件,编译阶段做的主要工作为:词法分析、语法分析、语义分析以及代码优化。
3、汇编:
汇编阶段由汇编器完成,汇编阶段完成后生成 .o 文件,也称为可重定位的二进制文件。汇编器是将汇编代码转化为机器可以执行的指令,每一个汇编语句几乎都对应一条机器指令。
二、链接
- 合并段和符号表
- 符号解析
- 分配地址和空间
- 符号重定位(链接器只关心全局变量,连接完成后所有的弱符号都放在 . bss 段)