C语言中程序编译系统的示例分析

发布时间:2022-03-01 09:13:34 作者:小新
来源:亿速云 阅读:169

这篇文章主要介绍C语言中程序编译系统的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

程序的翻译环境和执行环境

在ANSI C的任何一种实现中,存在两个不同的环境 :

第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。

第2种是执行环境 ,它用于实际执行代码。

一个.c的文件事如何变成.exe的可执行文件的呢?下面这张图片是一个大概的过程:

C语言中程序编译系统的示例分析

编译和链接

翻译环境

C语言中程序编译系统的示例分析

编译的几个阶段

接下来,我来用Linux平台来给大家演示一下编译的三个过程:

我们先编写一个简单C程序:

C语言中程序编译系统的示例分析

然后执行这样一句指令:

gcc test.c

这句指令是让gcc这个编译器来编译我们的代码,执行完这句指令我们会发现会生成一个a.out这样一个可执行文件,

C语言中程序编译系统的示例分析

我们执行再下面这样一句指令:

./a.out

这样我们就可以执行这个可执行文件了,

C语言中程序编译系统的示例分析

为了让大家更好地感受到编译的过程,我们来一步一步看:

预处理

我们执行再下面这样一句指令,让代码预处理完之后就停下来:

gcc -E test.c -o test.i

这句指令的意思就是把预处理完之后的信息输出到一个test.i的文件中。

C语言中程序编译系统的示例分析

可以发现的是,这里多了一个test,i的文件,我们可以打开看一看:

C语言中程序编译系统的示例分析

可以发现的是,有三个点发生了变化:

我们对原代码做一个处理,不包含stdio.h的头文件,我们自己写一个头文件:

C语言中程序编译系统的示例分析

再来看一下,预处理后的文件是什么样子的:

C语言中程序编译系统的示例分析

效果通上面一样。

所以预处理的几个动作

编译

执行再下面这样一句指令让文件进行编译形成汇编代码:

gcc -S test.c

C语言中程序编译系统的示例分析

执行完之后就可以生产出一个test.s的文件,我们可以打开看一看:

C语言中程序编译系统的示例分析

这里其实就是汇编代码。

所以编译的几个动作

符号汇总: 符号汇总的都是全局的符号。例如上面我们的代码头文件就汇总了一个Add,.c文件就汇总的一个Add和main。

汇编

接下来我们执行这样一条指令:

gcc -c test.c

对源文件进行汇编,结果生成了一个test.o的目标文件:

C语言中程序编译系统的示例分析

打开这个文件,我们会发现这是一个我们看不懂的二进制文件:

C语言中程序编译系统的示例分析

所以其实汇编是把汇编代码转换为二进制代码(机器指令)。

这个过程还做了一件件事——形成符号表

C语言中程序编译系统的示例分析

链接

链接做的两个事情

在Linux系统下,test.o二进制文件是用一个elf这样的格式来组织文件的。

elf会把文件组织成一个段。test.o和Add.o都有一个段,那么我们怎样才能看懂elf格式的文件呢?

我们有这样一个工具叫做readelf,他可以看懂这样一个文件,所以我们输入这样一条指令:

readelf test.o -a

C语言中程序编译系统的示例分析

我们就确实可以看到这样一个段的存在。

C语言中程序编译系统的示例分析

然后这下面还有符号表的汇总:

C语言中程序编译系统的示例分析

其实a.out这个文件也是elf格式的,所以其实链接就是把这几个elf格式的文件的段表合并,然后test中的Add函数就有了地址。

C语言中程序编译系统的示例分析

运行环境

程序执行的过程:

以上是“C语言中程序编译系统的示例分析”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!

推荐阅读:
  1. 小程序globalData的示例分析
  2. C语言指针的示例分析

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c语言

上一篇:如何解决VSCode配置python环境及中文问题

下一篇:localStorage如何设置有效期和过期时间

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》