编译流程
更新于2022-05-09
编译就是将文本代码编译成可以直接在机器上运行的文件。
编译整理流程

shell
gcc -v main.c -o a.out
cc1执行编译as执行汇编collect2执行链接
预处理
- 替换所有宏定义
- 处理所有条件预编译指令,#if、#elif、#endif等等
- 递归展开所有用到的#include头文件包含指令
- 删除所有注释
- 添加行号以及文件标识,便于报错提示以及生成调试信息
shell
#预处理命令cpp
cpp test.c -o test.i
#或直接使用gcc -E
gcc -E test.c -o test.i将源文件翻译成中间文件test.i
编译
- 词法分析
- 语法分析
- 语义分析
- 优化代码 将预处理后的代码编译成汇编代码
shell
/usr/lib/gcc/x86_64-linux-gnu/5/ccl test.i -o test.s
#或
gcc -S test.c -o test.s将中间文件翻译成汇编文件
汇编
shell
as test.s -o test.o
#或
gcc -c test.c -o test.o将汇编代码翻译成可重定向目标文件(relocatable object file) test.o
链接
shell
#系统库详见gcc -v 链接部分
ld test.o <系统库> -o test连接器将test.o和部分系统库链接成一个可执行目标文件(executable object file)
执行
shell调用加载器(loader)函数,将程序中的代码和数据拷贝到内存,将控制转移到程序开头。