编译流程¶
更新于2022-05-09
编译就是将文本代码编译成可以直接在机器上运行的文件。
编译整理流程¶
| Bash | |
|---|---|
1 | |
cc1执行编译as执行汇编collect2执行链接
预处理¶
- 替换所有宏定义
- 处理所有条件预编译指令,#if、#elif、#endif等等
- 递归展开所有用到的#include头文件包含指令
- 删除所有注释
- 添加行号以及文件标识,便于报错提示以及生成调试信息
将源文件翻译成中间文件test.i
Bash 1 2 3 4
#预处理命令cpp cpp test.c -o test.i #或直接使用gcc -E gcc -E test.c -o test.i
编译¶
- 词法分析
- 语法分析
- 语义分析
- 优化代码
将预处理后的代码编译成汇编代码
将中间文件翻译成汇编文件
Bash 1 2 3
/usr/lib/gcc/x86_64-linux-gnu/5/ccl test.i -o test.s #或 gcc -S test.c -o test.s
汇编¶
| Bash | |
|---|---|
1 2 3 | |
链接¶
| Bash | |
|---|---|
1 2 | |
执行¶
shell调用加载器(loader)函数,将程序中的代码和数据拷贝到内存,将控制转移到程序开头。