编译链接过程
预编译阶段
- 删除所有的“#define”,并且展开所有的宏定义;
- 处理所有的条件预编译指令,“#if”、“#ifdef”、“#endif”等;
- 处理“#include”预编译指令,将被包含的文件插入到该预编译指令的位置;
- 删除所有的注释;
- 添加行号和文件名标识,以便于编译器产生调试用的符号信息及编译时产生编译错
- 误和警告时显示行号;
- 保留所有的#pragma 编译器指令,因为编译器需要使用它们。
编译阶段
词法分析、语法分析、语义分析,代码优化,汇总符号。
汇编阶段
将汇编指令翻译成二进制格式,生成各个 section,生成符号表。
链接阶段
- 合并各个 section,调整 section 的起始位移和段大小,合并符号表,进行符号解析, 给符号分配虚拟地址;
- 符号重定位;