程序的生命周期:从.c文件到二进制文件
本文最后更新于:2025年6月25日 上午
一个.c文件是如何成为一个可执行二进制文件的?
| 文件后缀 | 被执行过程 | 工具 | 细节 |
|---|---|---|---|
| .c | 预处理 | 预处理器(cpp,c pre-processor) | 宏替换、头文件展开、注释删除 |
| .i | 编译 | ccl | C语言程序转化为汇编语言程序(.s) |
| .s | 汇编 | 编译器 | 汇编语言程序转化可重定位目标文件(.o) |
| .o | 链接 | ld(链接器) | 将多个.o文件链接为一个可执行文件 |

预处理
使用cpp(C 预处理器)完成了:
- 将.c文件转化为.i文件
- 在这里.i文件只是一个后缀而已,本质上仍然是文本文件
- 宏替换
- 头文件展开
- 找到#include的文件内容将其插入到.c文件中
- 注释删除
将hello.c文件得到的预处理结果重定向到hello.i
1 | |
可以使用man cpp得到预处理器的相关信息
测试代码:
1 | |
编译
- 使用编译器将.i文件转换为.s文件
- 将C语言文本转换为汇编语言文本(Assembly Code)
- 命令:
gcc hello.i -S -o hello.s
1 | |
| .file | 源文件 |
|---|---|
| .text | 代码段 |
| .global | 全局变量 |
| .data | 存放已经初始化的全局和静态C 变量 |
| .section .rodata | 存放只读变量 |
| .align | 对齐方式 |
| .type | 表示是函数类型/对象类型 |
| .size | 表示大小 |
| .long .string | 表示是long类型/string类型 |
汇编
- 编译器将汇编语言程序转化为可重定位目标文件
- .s —> .o 指令为
gcc -c hello.s -o hello.o - objdump 分析hello.o:
objdump -d hello.o
链接
将多个.o文件链接为一个可执行文件
关于链接器的更多内容:man ld
程序的生命周期:从.c文件到二进制文件
http://gls.show/p/2e9a027c/