一、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库
标签:文件,gcc,macro01,xxx,编译,过程,链接
From: https://www.cnblogs.com/goldenFantome/p/17589361.html