gcc的编译过程
一、gcc的编译过程、
- 源文件 xxx.c
- 预处理文件 xxx.i
- 汇编文件 xxx.s
- 未链接的二进制文件 xxx.o
- 通过连接,产生最终可执行的二进制文件
二、编译步骤的工作
1、预处理
- 头文件被包含进来(复制): #include
- 宏定义会被替换:#define
- 取消宏定义: #undef
- 条件编译: #if #ifdef #ifndef #else #elif #endif
- 修改行号以及文件名: #line 998 "Hello.c"
-------------在源文件中添加 #line 行号 “文件名.c”可以使预编译产生的文件按照对应的行号和文件名做标记
- 清除注释
2、编译
生成汇编文件
3、汇编
生成一个ELF格式的可重定位文件,即该文件包含让处理器直接运行的指令流,但它的全局符号未定位,其所有地址都是0
4、链接
- 重定位
- 合并权限相同的段,可理解为将多个文件合并为一个文件
三、查看各步骤的信息
1、预处理
gcc macro01.c -o macro01.i -E
2、编译
gcc macro01.i -o macro01.s -S
3、汇编
gcc macro01.s -o macro01.o -C
查看lef文件,重定位文件,可以看到上一节图片的内容
readelf macro01.o -a
4、链接
gcc macro01.o -o macro01 -lc -lgcc
-lc:链接标准C库
-lgcc:链接gcc库
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!