您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Model Center   Code  
会员   
   
 
     
   
 订阅
  捐助
谈谈c语言程序如何变成可执行文件
 
作者:mxrrr_sunshine
  2182  次浏览      17
 2020-1-20
 
编辑推荐:
文章介绍了c语言的环境翻译和编译,以及程序如何变成可执行文件,希望对您有所帮助。
文章来自于csdn,由火龙果Alice编辑推荐。

环境

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

翻译环境:在这个环境里,源代码被转换为可执行的机器指令。

执行环境:用于实际执行代码。

翻译环境

组成一个程序的每个源文件通过编译过程分别转成目标代码

各个目标文件由链接器捆绑在一起,形成一个单一而完整的可执行程序。

链接器同时也会引入标准c函数库中的任何被改程序所用到的函数。

过程如下图所示

实际上,翻译环境本身也有几个阶段组成:

编译

预编译阶段:在这个阶段主要进行一些文本操作,如处理预处理指令,删除注释,#define宏替换,条件编译。

我们可以在linux平台下测试一下,在这个阶段会产生一个.i文件。

首先写一个简单的程序,比如hello world,保存为test.c文件。

使用如下代码:

gcc -E test.c -o test.i

此时会出现一个test.i文件,vim打开可以观察到里面的代码已经不再是原来的hello world了,这一步会将#include包含的文件全部复制过来。

编译阶段

主要对代码进行解析,分析出语法错误词法错误,并且符号汇总。这一阶段完成后会形成.s文件,并且将c代码转成汇编语言。

使用如下代码:

gcc -S test.i -o test.s

打开可以观察到:都是汇编代码。

- 汇编阶段

在这一阶段,会形成符号表。并且将汇编代码转换成机器指令,二进制序列。

使用如下代码

gcc -c test.s -o test.o

打开可以看到,全部都是一些我们看不懂的东西,其实就是二进制序列。

链接

链接这一阶段主要是合并段表,合并符号表和对符号表的重定位。

编译阶段结束后,会生成一个a.out的文件,这个就是我们说的可执行程序,中间产生的.i .s .o文件会被自动删除(可使用如上代码保留)。

./a.out

此时可以看到屏幕上已经打印了hello world了。

执行环境

首先,程序必须载入内存,这个任务由操作系统完成。在独立环境中,必须手工安排,比如通过把可执行代码置入只读内存(ROM)来完成。

接着,调用main函数。

执行程序代码,程序将使用一个运行时堆栈,用于存储函数的局部变量和返回地址,程序同时也可以使用静态内存,存储于静态内存中的变量在整个执行过程中将一直保留他们的值。

终止程序。可以是正常终止,也可能是出现错误自行中断。

   
2182 次浏览       17
相关文章

深度解析:清理烂代码
如何编写出拥抱变化的代码
重构-使代码更简洁优美
团队项目开发"编码规范"系列文章
相关文档

重构-改善既有代码的设计
软件重构v2
代码整洁之道
高质量编程规范
相关课程

基于HTML5客户端、Web端的应用开发
HTML 5+CSS 开发
嵌入式C高质量编程
C++高级编程