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)完成。通过链接操作,对象文件中无法确定的符号地址已经被修正为实际的符号地址,程序也就可以被加载到内存中正常执行了。
编译原理
最新推荐文章于 2023-09-13 14:03:24 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)