GCC编译过程回顾

最近在查找有关Makefile的资料的时候又复习了一遍gcc编译的过程。

1.预编译

gcc -E hello.c -o hello.i
cpp hello.c > hello.i
  • 宏定义的处理 #define #ifndef #endif等
  • 处理#include后面文件的包含
  • 忽略掉所有的注释
  • 添加行号和文件名表示用于报错时候的提醒
  • 保留#program编译器指令

2.编译

gcc -S hello.i -o hello.s
  • 将预处理之后的文件进行语法分析、词法分析以及语义分析、优化等。
  • 生成汇编代码文件。构建中最复杂的一部,区别编译器好坏的一步。

3.汇编

gcc -c hello.s -o hello.o 或者 as hello.s -o hello.o

汇编是指第二步生成的汇编代码变成机器可以执行的指令

4.链接 (Link)

连接的过程就是链接动态库和静态库的过程

生成的目标文件.o与可执行文件之间的区别?

目标文件就是最后汇编之后生成的文件,但是少了链接的那一步·,其实它与可执行文件的内容大致是一致的,所以都被广义的归为一类文件,也就是ELF文件,都是按照ELF文件格式存储的

LINUX下的ELF文件类型

.o文件、可执行文件、核心转储文件(core dump)、.so文件(动态链链接库)

gcc作用

其实gcc并非是编译器,它是一系列的编译程序套件,它类似于一个接口我们输入一些指令去让他调用相应的编译器。

参考的文章:

https://blog.csdn.net/gt1025814447/article/details/80442673

猜你喜欢

转载自blog.csdn.net/weixin_42427338/article/details/85405085