一、C中的可执行程序是如何生成的
对于一个C语言源文件,我们需要四个步骤将它转换成计算机可以执行的形式。
在C/C++中,编译单元为源文件。也就是说我们会对每一个源文件进行编译,生成对应的目标文件。然后将多个目标文件链接在一起,生成可执行程序。
1.预处理
首先程序会由预处理器(preprocessor)进行处理,预处理器执行以**’#’**开头的指令(预处理指令)。预处理指令一般都比较简单:比如将头文件中内容复制到源代码中,或者是对宏进行文本替换。
- #include:头文件包含(把头文件中的内容复制到指令所在位置)
- #define N 5:宏定义(简单的文本替换)
- #define FOO(x) (1+(x)*(x)):宏函数(本质上还是文本替换,注意括号)
预处理之后将生成**’.i’**文件。
2.编译
经过预处理的文件将会被编译器编译,编译器会将程序翻译成对应平台的汇编代码。
编译之后将生成**’.s’**文件的汇编代码。
3.汇编
汇编器会将汇编代码翻译成对应平台的机器代码(目标代码)。
汇编之后将生成**’.o’**的目标文件。
4.链接
在链接阶段,链接器会把由汇编器生成的目标代码和程序需要的其他附加代 码整合在一起,生成最终可执行的程序。
这些附加代码包括程序中用到的库函数。
二、进程虚拟内存空间
生成的可执行文件被操作性系统加载到内存,程序才能运行。运行的程序我们称之为进程,每个进程都有自己的寻你内存空间。简化图如下所示。
![image-20240826205947061](C:\Users\Roxy\AppData\Roaming\Typora\typora-user-images\image-20240826205947061.png)
从上到下分别是内核、栈、堆、数据、代码。