谈谈c语言程序如何变成可执行文件
来源:互联网 发布:淘宝小号申请 编辑:程序博客网 时间:2024/05/17 02:21
环境
在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函数。
- 执行程序代码,程序将使用一个运行时堆栈,用于存储函数的局部变量和返回地址,程序同时也可以使用静态内存,存储于静态内存中的变量在整个执行过程中将一直保留他们的值。
- 终止程序。可以是正常终止,也可能是出现错误自行中断。
阅读全文
0 0
- 谈谈c语言程序如何变成可执行文件
- c语言编译流程(c语言是如何变成可执行文件的)
- C语言hello.c如何变成执行程序的
- 如何将java程序变成exe可执行文件(转)
- java程序变成exe可执行文件
- C语言程序如何从代码变成可执行程序?(预处理总结)
- C语言源程序(.c)如何变成可执行程序(.exe)
- 什么是BSS段和c语言程序如何变成可执行的文件
- 源程序怎么变成可执行文件—学C语言难免碰到的困惑
- 将java程序变成exe可执行文件
- C/C++程序编译步骤 如何生成可执行文件
- C/C++程序编译步骤 如何生成可执行文件
- C/C++程序编译步骤 如何生成可执行文件
- C/C++程序编译步骤 如何生成可执行文件
- C/C++程序编译步骤以及如何生成可执行文件
- C/C++程序编译步骤 如何生成可执行文件
- C语言基础 如何将正数变成负数
- C的代码是如何变成程序的
- linux下go环境变量配置
- Linux常用指令
- 已知/tmp目录下已经存在了test.txt文件,如何执行命令才能把/mnt/test.txt拷贝到/tmp下覆盖掉/tmp/test.txt,而让linux系统不提示是否覆盖(root权限下)
- 今天的题
- Maven的filtering和profile标签使用
- 谈谈c语言程序如何变成可执行文件
- 欢迎使用CSDN-markdown编辑器
- 1050. 螺旋矩阵(25)
- 常见的HTTP状态码和提示信息
- SQL学习(6)
- LogCook 一个简单实用的Android日志管理工具
- VB.NET机房收费系统之报表制作(绑定数据源)(二)
- 高效使用Pycharm不完全指南
- OptionSet(静态属性集合)