gcc的编译过程

goldenFantome / 2023-07-29 / 原文

一、gcc的编译过程、

  1. 源文件 xxx.c
  2. 预处理文件 xxx.i
  3. 汇编文件 xxx.s
  4. 未链接的二进制文件 xxx.o
  5. 通过连接,产生最终可执行的二进制文件

二、编译步骤的工作

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库