💕💕这里是c语言之汇编与链接💕💕
💕💕想要了解更多内容,请点进我的主页呱OMGmyhair的博客主页💕💕
前言:
你也许知道在我们编译我们的程序时,会有以下四个步骤:预处理、编译、汇编、链接。但是其中具体的奥秘,你可能就不大清楚了,今天我就来带你认识这几位最熟悉的陌生人~😊😊
首先,以gcc为例分解编译过程:
1.预处理/预编译
1.1预处理过程
在这个过程里,源文件和头文件被处理成以.i为后缀的文件。
在这一步里,主要处理源代码文件中以“#”开始的预编译指令。例如我们经常使用的:#define、#include。
1.2主要处理规则
- 将所有的 #define 删除,并展开所有的宏定义。
- 处理所有的条件编译指令,如: #if、#ifdef、#elif、#else、#endif 。
- 处理#include 预编译指令,将包含的头⽂件的内容插⼊到该预编译指令的位置。这个过程是递归进 ⾏的,也就是说被包含的头⽂件也可能包含其他⽂件。
- 删除所有的注释
- 添加⾏号和⽂件名标识,⽅便后续编译器⽣成调试信息等。
- 保留所有的#pragma的编译器指令,编译器后续会使⽤。
在这一过程里,包含的头文件会被展开,而#define标记的标识符会被替换。
例如:
这一段代码会在预处理阶段被处理成:#define被删除,对标识符进行替换
2.编译
2.1编译过程

2.2词法分析
2.3语法分析
2.4语义分析
3.汇编
4.链接
随着代码量日渐增长,人们将代码按照功能和性质划分,形成了各种各样的功能模块。而将这些我们需要的模块联系起来的过程就是链接。而链接过程主要包括了地址和空间分配、符号决议、和重定位等这些步骤。在最基本的静态链接过程中,每个模块的源代码文件经过编译器编译成目标文件,目标文件和库一起链接形成最终可执行文件。最常见的库就是运行时库,它是支持程序运行的基本函数的集合。
举个例子,当我们在引用别的模块中的函数时,main不知道这个函数的地址,于是它将该函数地址搁置。等到链接器进行链接时,链接器会根据这个函数名去相应模块查找该函数的地址,然后再将main函数中搁置的地址进行修正。这个地址修正的过程被称为重定位,而要被修正的地方叫重定位入口。