最近在查找有关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并非是编译器,它是一系列的编译程序套件,它类似于一个接口我们输入一些指令去让他调用相应的编译器。
参考的文章: