编译原理

GCC的编译包括四个阶段:预处理、编译、汇编和链接。分别使用了cc1、as和collect2三个工具。cc1是编译器,对应第一和第二阶段,用于将源文件hello.c编译为hello.s;as是汇编器,对应第三阶段,用于将hello.s汇编为hello.o目标文件;链接器collect2是对ld命令的封装,用于将C语言运行时库(CTR)中的目标文件(crt1.o、crti.o、crtbegin.o、crtn.o)以及所需的动态链接库(libgcc.so、libgcc_s.so、libc.so)链接到可执行hello。
1、预处理阶段:主要是处理源代码中以#开始的预处理指令,比如#include、#define等,将其转换后直接插入程序文本中,得到另一个C程序,通常以 ‘.i’作为文件拓展名。
预处理的处理规则:
递归处理#define预处理指令,将对应文件的内容复制到该指令的位置;
删除所有的#define指令,并且在其被引用的位置递归的展开所有的宏定义;
处理所有条件预处理指令‘#if’、‘#ifdef’、‘elif’、‘#else’、“#endif”等;
删除所有注释;
添加行号和文件名标识;
2、编译阶段:
将预处理文件进行一系列的词法分析、语法分析、语义分析以及优化,最终生成汇编代码。
3、汇编阶段:
汇编器根据汇编指令与机器指令的对照表进行翻译,将hello.s汇编成目标文件hello.o。此时的目标文件hello.o是一个可重定位文件。
4、链接阶段:
可分为静态链接和动态链接两种。GCC默认使用动态链接,添加编译选项-static即可指定使用静态链接。这一阶段将目标文件及其依赖库进行链接,生成可执行文件,主要包括地址和空间分配、符号绑定和重定位等操作。链接操作由链接器(ld.so)完成。通过链接操作,对象文件中无法确定的符号地址已经被修正为实际的符号地址,程序也就可以被加载到内存中正常执行了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值