c程序的创建与执行的过程

小鱼儿 2022-11-17 03:42 168阅读 0赞

当我们编写了一个c程序,并生成了一个名为hello.c的文件,接下来需要把程序变为机器可以执行的形式:那么系统到底做了哪些工作呢?

首先可以明确的是必须将源代码转换为机器语言,c程序才可以被机器执行,这个转换工作是编译器帮我们做的。
具体处理过程:

首先预处理程序,在编译开始之前自动执行,预处理程序只处理源码中的以#开头的代码,如:#inclue等,会将stdio.h包含进来,这样编译器才可以理解printf以及其他的输入输出函数所需要的信息。

以.h为扩展名的文件称为头文件,头文件可以是编译器自带的头文件,也可以是自己定义的头文件。编译器自带的头文件里面主要包含与c标准库函数相关的声明,所以#include是编译器自带的头文件,只是调用了c标准库函数以及可能添加了一些自己定义的库函数。

预处理器处理完成后,此时进入编译阶段,如果编译成功会产生一个目标文件,该文件与源文件同名,扩展名是.o或.obj,关于.obj文件的内容,可以参考这两篇不错的博客:https://blog.csdn.net/zhuoya\_/article/details/78398389
https://blog.csdn.net/qq\_29328443/article/details/107183383
简单来说.o或.obj文件中存放着关于源码的代码信息,全局变量以及静态变量的信息等。不过需要注意的是编译阶段是不为变量分配内存空间的,全局变量以及静态变量也是不分配内存的,只不过可以确定他们的类型以及值。

编译完成后,在链接过程,链接器会将目标文件与函数库中已经编译好的目标代码组合起来,生成最终的可执行文件。然后,可执行文件加载到内存中,在CPU的控制下,逐条执行程序中的机器指令。此时可以看到可执行文件中的VMA(虚拟内存地址)和DMA(加载内存地址)已经不是0了,说明已为其分配了内存空间。


查看.o目标文件与可执行文件的过程
在这里插入图片描述
可以看出此时VMA与LMA是0,所以编译阶段不分配内存
接着cc -o a 1.c -g进行链接生成可执行的文件a,然后objdump -h a查看
在这里插入图片描述
可以发现此时的VMA和LMA不为0,表示已经将可执行文件加载到内存并分配了存储空间。

发表评论

表情:
评论列表 (有 0 条评论,168人围观)

还没有评论,来说两句吧...

相关阅读