程序的编译过程(转)
预处理、编译、汇编、链接
预处理:
- 删除 #define 并展开宏定义
- 处理所有的条件预编译指令,如 "#if","#ifdef","#endif"等
- 插入头文件到 "#include" 处,可以递归方式进行处理
- 删除所有的注释
- 添加行号和文件名标识,以便编译时编译器产生调试用的行号信息
- 保留所有 #pragma 编译指令(编译器需要用)
命令示例如下: - gcc -E hello.c -o hello.i
编译:
编译过程就是将预处理后得到的预处理文件(如hello.i)进行词法分析、语法分析、语义分析、优化后,生成汇编代码文件。
经过编译后,得到的汇编代码文件(如,hello.S)还是一个可读的文本文件。
命令示例如下:
- gcc -S hello.i -o hello.s
- gcc -S hello.c -o hello.s
汇编:
汇编器将编译得到的汇编代码文件转换成机器指令序列。
汇编的结果是一个可重定位目标文件(如,hello.o)其中包含的是不可读的二进制代码。
命令示例如下:
- gcc -c hello.s -o hello.o
- gcc -c hello.c -o hello.o
- as hello.s -o hello.o
链接:
链接过程将多个可重定位目标文件合并以生成可执行目标文件。
命令示例如下:
- gcc -static -o myproc main.o test.o
- ld -static -o myproc main.o test.o
作者:N8_xEnn7nA1
链接:https://www.jianshu.com/p/b7e44f749211
来源:简书
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现