从源程序到可执行性程序,文本文件→预处理→编译→汇编→链接→可执行文件

从源程序到可执行性程序,预处理--> 编译--> 汇编--> 链接

从源程序到可执行性程序

集成开发环境

对于集成开发环境(IDE,Integrated Development Environment )而言,减少了环 境配置,合并了流程,使其便于快速开发。就 Qt 开发环境或者vs开发环境等只需一步即可。

在这里插入图片描述
或者在vs环境下我们直接运行即可。
在这里插入图片描述

源程序就是一个.txt 的普通文本文件,但是实际是经历了哪些过程,变为可执行性文件的呢?
我们先直接说明大体上分为四个步骤:

预处理 -> 编译 -> 汇编 -> 链接

我们前面提到在windows环境的集成开发环境里面这些步骤编译器直接执行了。所以我们在linux平台进行演示。

unix /linux 环境下,通常没有界面,所以少有集成开发环境。所有的开发均是在命 令行模试下开发的。以 vim 为编辑器,以 gcc 为编译器为例演示。

我们先给出完成过程然后进行分步演示:

① vim hello.c
② gcc -E hello.c -o hello.i //处理文件包含,宏和注释
③ gcc -S hello.i -o hello.s //编译为汇编文件
④ gcc -c hello.s -o hello.o //经汇编后为二进制的机器指令
⑤ gcc hello.o -o hello //链接所用的到库

我们先通过文本编译器编写代码:
我们通过vi hello.c 编写文本格式的代码:

#include<stdio.h>
int main()
{
        printf("hello world\n");
        return 0;
}

预处理

gcc -E hello.c -o hello.i E是编译型参数 -o 表述output 输出 为hello.i
经过gcc -E命令可生成预处理后的源文件

执行结果为:
在这里插入图片描述我们来查看一下hello.i里面的内容。
这个文件很长,我们只截取最后一部分:
在这里插入图片描述
“预处理”过程:

1.处理所有条件编译指令,如:#ifndef、#ifdef、或者#if等。
2.处理所有文件包含指令,如:#include <stdio.h>,预处理器会将stdio.h文件内容插入到该指令位置。
3.删除所有注释代码,如"//“和”//"。
4.添加文件标识和行号,以便后续代码编译或调试时错误或警告信息提供行号或文件标识。

我们发现我们源程序中所在的int main()之后的内容都在,但是上面include 没有了。那么上面的所有内容都是由#include <stdio.h> 所替换,#include是包含,这里上面的所有内容其实就是对于stdio.h的一次展开。

编译

gcc -S hello.i -o hello.s S是参数
生成编译之后的hello.s文件。
执行结果为:
在这里插入图片描述
我们打开main.s文件
在这里插入图片描述

我们可以看到最起码会感觉认识一些,如果学习过汇编的读者就知道上面就是汇编语言代码。

汇编

gcc -c hello.s -o hello.o
执行结果为:
在这里插入图片描述
我们来查看一下生成的hello.o文件:
在这里插入图片描述
我们可以看到这个是后已经是二进制文件。但是能不能执行呢?我们先来测试一下
在这里插入图片描述

我们可以看到没有权限,因为他不是一个可执行性文件,(关于文件的熟悉读者在linux博客查看,这里不做过多说明。)那么我们现在给hellio.o 加一个可执行权限。
在这里插入图片描述
执行结果为:
在这里插入图片描述

我们可以看到hello.o是一个不可执行的二进制文件。

链接

gcc hello.o -o hello
在这里插入图片描述

当然我们也可以直接使用

gcc hello.o

会自动生成a.out可执行性文件。

接下来我们执行可执行性程序:
在这里插入图片描述
我们来查看一下hello可执行文件的内容:
在这里插入图片描述

我们可以明显看到比hello.o 里面的内容多。
所以来链接会链接标准库所需要的函数,例如我们这里用到的printf函数并不是我们自己实现的,是通过链接库来实现的,所以链接之后最终的可执行性文件内容会变多。

总结

① 预处理:预处理相当于根据预处理命令组装成新的 C 程序,不过常以 i 为扩展名。
② 编 译:将得到的 i 文件翻译成汇编代码 .s 文件。
③ 汇 编:将汇编文件翻译成机器指令,并打包成可重定位目标程序的 O 文件。
该文件是二进制文件,字节编码是机器指令。
④ 链 接:将引用的其他 O 文件并入到我们程序所在的 o 文件中,处理得到最终
的可执行文件。

在这里插入图片描述
在这里插入图片描述

发布了84 篇原创文章 · 获赞 71 · 访问量 9104

猜你喜欢

转载自blog.csdn.net/qq_43648751/article/details/104182260