首页 > 作文

C语言 程序的编译系统解析

更新时间:2023-04-05 23:00:16 阅读: 评论:0

今天我来补一下c语言篇的程序的编译的一篇文章,也算是有一个结尾了。

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

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

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

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

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

编译和链接

翻译环境

组成一个程序的每个源文件通过编译过程分别转换成目标代码( object code )。每个目标文件由链接器( linker )捆绑在一 起,形成一个单一-而完整的可执行程序。链接器同时也会引入标准c函数库中任何被该程序所用到的函数,而且它可以搜索程序员个人的程序库,将其需要的函数也链接到程序中。

编译的几个阶段

接下来,我来用linux平台来给大家相对误差怎么计算演示一下编译的三个过程:

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

然后执行这样一句指令:

gcc test.c

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

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

./a.out

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

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

预处理

我们执行再阿狸和桃子的故事下面这样一句指令,让代码预处理完之后就停下来:

gcc -e test.c -o test.i

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

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

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

头文件被展开宏被文本替换了注释被删除了

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

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

效果通上面一样。

所以预处理的几个动作

头文件的包含预处理指令的完成(eg:#define、#pragma…)注释的删除

编译

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

gcc -s test.c

描写泰山的诗句

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

这里其实就是汇编代码。

所以编译的几个动作

语法分析词法分析语义分析符号汇总

符号汇总: 符号汇总的都是全局的非主流个性签名繁体字符号。例如上面我们的代码头文件就汇总了一个add,.c文件就汇总的一个add和main。

汇编

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

gcc -c test.c

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

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

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

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

链接

链接做的两个事情

合并段表符号表的合并和符号表的重定位

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

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

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

readelf test.o -a

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

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

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

运行环境

程序执行的过程:

程序必须载入内存中。在有操作系统的环境中:一般这个由操作系统完成。在独立的环境中,程序的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成。程序的执行便开始。接着便调用main函数。开始执行程序代码。这个时候程序将使用一个运行时堆栈(stack),存储函数的局部变量和返回地址。程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程一直保留他们的值。终止程序。正常终止main函数;也有可能是意外终止。

到此这篇关于c语言 程序的编译系统解析的文章就介绍到这了,更多相关c语言 程序编译内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!

本文发布于:2023-04-05 23:00:14,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/cc2dc8845f0e932ae189ce24962727ec.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:C语言 程序的编译系统解析.doc

本文 PDF 下载地址:C语言 程序的编译系统解析.pdf

标签:程序   文件   指令   符号
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图