![c源文件到可执行文件](https://img-blog.csdnimg.cn/32fc64ffa7d04d35805b869caeb88544.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAb3JpZ2luYWxf,size_20,color_FFFFFF,t_70,g_se,x_16)
预处理
gcc -E hello.c -o hello.i
- 头文件展开:不检查语法错误,可以展开任意文件
- 宏定义替换:将定义的宏符号替换为对应的值
- 替换注释:将注释替换为空行
- 展开条件编译:根据条件来展开指令(#ifdef/#endif)
编译
gcc -S hello.i -o hello.s
- 逐行检查语法错误(最耗时的过程)
- 将c程序翻译成汇编指令
汇编
gcc -c hello.s -o hello.o
- 将汇编指令翻译成对应的二进制编码
链接
gcc hello.o -o hello.exe
- 数据段合并
- 数据地址回填
- 库引入