跳转至

编译流程


更新于2022-05-09

编译就是将文本代码编译成可以直接在机器上运行的文件。

编译整理流程

compile

Bash
1
gcc -v main.c -o a.out
example cc1执行编译
as执行汇编
collect2执行链接

预处理

  • 替换所有宏定义
  • 处理所有条件预编译指令,#if、#elif、#endif等等
  • 递归展开所有用到的#include头文件包含指令
  • 删除所有注释
  • 添加行号以及文件标识,便于报错提示以及生成调试信息
    Bash
    1
    2
    3
    4
    #预处理命令cpp
    cpp test.c -o test.i
    #或直接使用gcc -E
    gcc -E test.c -o test.i
    
    将源文件翻译成中间文件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
as test.s -o test.o
#或
gcc -c test.c -o test.o
将汇编代码翻译成可重定向目标文件(relocatable object file) test.o

链接

Bash
1
2
#系统库详见gcc -v 链接部分
ld test.o <系统库> -o test
连接器将test.o和部分系统库链接成一个可执行目标文件(executable object file)

执行

shell调用加载器(loader)函数,将程序中的代码和数据拷贝到内存,将控制转移到程序开头。