现代编译过程

现代编译过程

编译过程分为五步:

  • 扫描解析文件
  • 预处理工作

处理宏定义,不管是由-D参数指定,还是在源码内部通过#define,或者使用了标准库,扩展库中的宏,都会替换为定义的值。 命令:cpp
a.c>a.i
输出的a.i就是预处理过的文件,包含了完整的内容。
由此可以得出,宏不是运行时的定义内容,也不是编译时的内容,而是预处理阶段就完成的。

  • 编译阶段:

将源代码(也就是预处理过的代码)编译为特定机器的汇编语言。 命令:gcc -S -Wall a.i 输出为特定的汇编内容。

  • 汇编阶段:

将汇编源码汇编为机器码内容。 命令:as a.s -o a.o
此处如果有对外部的函数使用,则会预留未定义的地址,以供最后一步链接来使用。

  • 链接阶段:

将链接对象文件(上编译汇编后的文件)链接为可执行文件,此过程比较复杂,需要链接很多外部的库文件,包括静态的,动态的库。 命令:ld
-dynamic-linker .. .. ..
可以使用gcc a.o 来简化上一过程。 最后得出的是可执行文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值