GCC编译四个阶段
2014-11-06 北京
Gcc编译会经历四个阶段:
1.预处理阶段(Pre-Processing)
在这个阶段主要处理的就是条件编译,头文件展开,宏替换。
gcc -E hello.c -o hello.i
2.编译阶段(Compiling)
在这个阶段主要进行的是将C语言代码编译成汇编代码。
gcc -S hello.i -o hello.s
3.汇编阶段(Assembling)
在这个阶段主要进行的是将汇编代码编译生成目标代码,到这个阶段生成的就是二进制文件了,我的打开此种文件会发现时乱码。
gcc -c hello.s -o hello.o
4.链接阶段(Linking)
目标代码与库相连接形成可执行文件(linux 下为a.out)。
gcc hello.o -o hello
解释一下 -o是类似于重命名的一个选项,方便我们观察每一个阶段生成的文件后缀名以及可以把相应的可执行程序重命名。
下面通过程序来让大家更直观的了解四个编译阶段:
首先是很简单的一个测试程序
文件里定义了一个宏,两个条件编译,第一个不会执行,第二个会执行,然后我们观察预处理阶段的作用。
通过调用gcc -E hello.c -o hello.i,我们打开hello.i文件
头文件很长,可以看到经过预处理阶段后代码变成了864行,这就是头文件展开的结果,还有我们定义的宏被替换,两个条件编译会判断是否去执行。
第二个阶段,编译阶段调用gcc -S hello.i -o hello.s,我们打开hello.s
这个阶段生成的代码已经是汇编代码了,到这个阶段位置我们还可以看得懂代码;
第三个阶段:gcc -c hello.s -o hello.o 打开hello.o
可以看到,这个已经是乱码了,我们通过文件属性可以得到
第四个阶段 gcc hello.o -o hello
打开文件属性:
这个时候的文件都已经为ELF格式了,也就是可执行程序。
最终我们执行./hello