一、C中的可执行程序是如何生成的

对于一个C语言源文件,我们需要四个步骤将它转换成计算机可以执行的形式。

111

在C/C++中,编译单元为源文件。也就是说我们会对每一个源文件进行编译,生成对应的目标文件。然后将多个目标文件链接在一起,生成可执行程序。

1.预处理

首先程序会由预处理器(preprocessor)进行处理,预处理器执行以**’#’**开头的指令(预处理指令)。预处理指令一般都比较简单:比如将头文件中内容复制到源代码中,或者是对宏进行文本替换。

image-20240826203807173

  • #include:头文件包含(把头文件中的内容复制到指令所在位置)
  • #define N 5:宏定义(简单的文本替换)
  • #define FOO(x) (1+(x)*(x)):宏函数(本质上还是文本替换,注意括号)

预处理之后将生成**’.i’**文件。

2.编译

经过预处理的文件将会被编译器编译,编译器会将程序翻译成对应平台的汇编代码。

编译之后将生成**’.s’**文件的汇编代码。

3.汇编

汇编器会将汇编代码翻译成对应平台的机器代码(目标代码)。

汇编之后将生成**’.o’**的目标文件。

4.链接

在链接阶段,链接器会把由汇编器生成的目标代码和程序需要的其他附加代 码整合在一起,生成最终可执行的程序。

这些附加代码包括程序中用到的库函数。

二、进程虚拟内存空间

生成的可执行文件被操作性系统加载到内存,程序才能运行。运行的程序我们称之为进程,每个进程都有自己的寻你内存空间。简化图如下所示。

image-20240826205947061

从上到下分别是内核、栈、堆、数据、代码。


Author: Yui-Megumi
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source Yui-Megumi !
评论
  TOC