GCC编译的四个阶段【转载请声明】

本文详细解析GCC编译过程的四个阶段:预处理、编译、汇编和链接,通过实际程序展示每个阶段的变化,并解释了-o选项的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值