C语言之a.out简介

在Linux下编译链接程序时,如果不用‘-o’选项来指定输出文件名称,默认情况下就会输出名为‘a.out’的文件。为什么默认是‘a.out’而不是别的名称呢?这是一个历史遗留问题。

在早期的BSD文档里有下面的提示:

a.out     ——   汇编程序和链接编辑输出格式。

可以看出它是一种输出格式,与EFL格式、二进制格式等是并列的。a.out是‘assembler output(汇编程序输出)’的缩写形式。以前并不存在连接器,程序一般是这样创建的:先把所有源文件连接在一起,然后进行汇编,汇编产生的汇编程序输出保存在a.out中。等有了连接器后,仍然保留了“输出文件默认为a.out”的命名习惯。

现在,a.out被普遍使用的ELF格式所替代,但输出文件名仍旧是a.out。我们看到的a.out只是一个可执行文件,而不再是文件格式。ELF可执行文件的第一个字节是八进制177,紧跟其后的2、3、4字节是ELF三个字母。可输入od -c a.out | head 查看。

既然是一种输出格式,那么它都是由哪几部分组成的呢?它一般由下面几部分组成:

执行头部:包含内核将二进制文件加载内存并执行所需的参数,也包含对链接编辑器ld的指引。

文本段:包含运行时被载入内存的机器码的相关数据,可能是只读的。

数据段:包含已初始化的数据,总是可写的。

文本重定位:包含链接编辑器在合并二进制文件时修改文件段指针的记录。

数据重定位:与文本重定位类似,但是给数据段指针用。

符号表:包含链接编辑器用于交叉引用不同二进制文件中变量和函数的记录。

字符串表:包含对应于符号表的字符串。

以一个程序out.c为例分析各部分会出现在哪些段中:

#include <malloc.h>

char pear[40];
static double peach;

int    mango = 13;
static long melon = 2001;

void
main()
{
    int i = 3, j, *ip;

    ip = malloc(sizeof(i));
    pear[5] = i;
    peach = 2.0 * mango;
}

图 out.c程序语句的各部分会出现在哪些段中

操作系统在a.out文件里干了些什么?

为什么a.out要以段的形式组织。段可以方便地映射到链接器在运行时可以直接载入的对象中。载入器只是取文件中每个段的映像,并直接将它们放入内存中,从本质上说,段在正在执行的程序中是一块内存区域,每个区域都有特定的目的。

文本段包含程序的指令。连接器把指令直接从文件拷贝到内存中,以后便再也不用管它。数据段包含经过初始化的全局和静态变量以及它们的值。BSS段的大小从可执行文件中得到,然后链接器得到这个大小的内存块,紧跟在数据段之后。

C语言之a.out简介

时间: 2024-10-12 16:06:44

C语言之a.out简介的相关文章

[转]SQLITE3 C语言接口 API 函数简介

SQLITE3 C语言接口 API 函数简介 说明:本说明文档属作者从接触 SQLite 开始认识的 API 函数的使用方法, 由本人翻译, 不断更新. /* 2012-05-25 */ int sqlite3_open( const char* filename, /* 数据库文件名, 必须为 UTF-8 格式 */ sqlite3** ppDB /* 输出: SQLite 数据库句柄 */ ); 说明: 该函数打开由 filename 指定的数据库, 一个数据库连接句柄由 *ppDB 返回(

C语言基础知识【简介】

C 简介1.关于 CC 语言是为了编写 UNIX 操作系统而被发明的.C 语言是以 B 语言为基础的,B 语言大概是在 1970 年被引进的.C 语言标准是于 1988 年由美国国家标准协会(ANSI,全称 American National Standard Institute)制定的.截至 1973 年,UNIX 操作系统完全使用 C 语言编写.目前,C 语言是最广泛使用的系统程序设计语言.大多数先进的软件都是使用 C 语言实现的.当今最流行的 Linux 操作系统和 RDBMS(Relat

Java入门 - 语言基础 - 01.Java简介

原文地址:http://www.work100.net/training/java-intro.html 更多教程:光束云 - 免费课程 Java简介 序号 文内章节 视频 1 概述 2 主要特性 3 发展历史 4 开发工具 请参照如上章节导航进行阅读 1.概述 Java 是由 Sun Microsystems 公司于1995年5月推出的 Java 面向对象程序设计语言和 Java 平台的总称.由 James Gosling 和同事们共同研发,并在1995年正式推出. Java 分为三个体系:

ios开发中的C语言学习—— 结构体简介

在开发过程中,经常会需要处理一组不同类型的数据,比如学生的个人信息,由姓名.年龄.性别.身高等组成,因为这些数据是由不同数据类型组成的,因此不能用数组表示,对于不同数据类型的一组数据,可以采用结构体来进行存储.当然,对于面向对象的语言来说,最好是用类来表示,但是C语言是面向过程的,因此选择用结构体来表示. 一.结构体的定义 struct 结构体名{ 类型名 成员名1; 类型名 成员名2; ... ... 类型名 成员名n; }; 二.结构体的变量声明 1.先定义结构体类型,再定义变量 代码 //

Java知多少(76)语言包(java.lang)简介

Java语言包(java.lang)定义了Java中的大多数基本类,由Java语言自动调用,不需要显示声明.该包中包含了Object类,Object类是整个类层次结构的根结点,同时还定义了基本数据类型的类,如:String.Boolean.Byter.Short等.这些类支持数字类型的转换和字符串的操作等,下面将进行简单介绍. Math类 Math类提供了常用的数学运算方法以及Math.PI和Math.E两个数学常量.该类是final的,不能被继承,类中的方法和属性全部是静态,不允许在类的外部创

R语言空间分析功能简介

大家知道,R语言的软件包都是各领域专家贡献而来,通过一个统一的开放的语言环境神奇地组装到了一起,然后开始产生化学反应,为大数据分析立下汗马功劳. R中已经有一个Spatial软件包.通过library(sp)即可加载,如果提示没有安装,使用install.packages("sp")进行安装即可,安装过程中需要选择一个软件分发站的镜像. 然后使用getClass("Spatial")即可查看类的信息.返回信息如下: > getClass("Spati

C语言的一些知识简介

1.数据类型概述 C 语言包含的数据类型如下图所示: C 语言包含的数据类型如下图所示: 在32 位的WIN7系统上short 类型在内存大小是2 个byte:int 类型在内存大小是4 个byte:long 类型在内存大小是4 个byte:float 类型在内存大小是4 个byte:double 类型在内存大小是8 个byte:char 类型在内存大小是1 个byte.(注意这里指一般情况,可能不同的平台还会有所不同,具体平台可以用sizeof 关键字测试一下) 2.数组一维数组: 怎样定义一

java语言与jvm虚拟机简介

一.java语言 1.1 支持面向对象编程oop 强调支持,因为java同样可以面向过程编程. oop的三大特性是:封装.继承.多态. 封装主要针对成员变量而言,oop的思想要求成员变量均为私有,不应该对外能够访问,一个符合oop思想的类应该只有公共方法对外能够访问: 继承,主要理解继承体系,private.protected.public在继承中的使用场景.理解java是单继承多实现的(与C++的区别): 多态主要指一个类的实例是运行时决定的,而不是声明时决定的.父类 a = new 子类()

Java语言编程 - Java历史简介

1.1 Sun公司 介绍Java的历史之前,先介绍一下Java语言的缔造公司,Sun公司,Sun公司的全称是:Stanford University Network.值得一提的是,Sun公司从1982年成立到2000年达到顶峰用了近二十年时间,而走下坡路只用了一年,最后2009年4月20日甲骨文以现金收购Sun公司,交易价格达74亿美元. 1.2 计算机语言的发展 计算机语言也是一步步发展起来的,由最初的机器语言,直接用机器能识别0和1写程序,对于人来说很难用这样的语言:之后出现了汇编语言,利用