linux下的a.out文件

.out文件就是扩展名为out的文件,它本身不代表任何信息。在Linux中判断文件是否是可执行文件,首先要看文件的属性是否是可执行的,它没有一个默认的扩展名表示此文件为可执行文件。为了方便,Linux中可执行文件一般都是没有扩展名的。
在使用gcc编程时,没有指定输入可执行文件名,默认生成可执行文件a.out文件。执行时必须键入命令 ./a.out,即要带上扩展名,如果键入./a 则不正确,因为它寻找a这个文件,而不是a.out这个文件。

a.out是由OMAGIC, NMAGIC, QMAGIC, 或者 ZMAGIC发展过来的一种可执行文件格式.
OMAGIC :在文件头之后就是各个段,但是部分文本段和数据段.
NMAGIC:和OMAGIC差不多,但是数据段在代码段之后加载之后就立即加载数据段,并且将代码段标示位只读.
ZMAGIC:只是增加了对页需求的支持.
QMAGIC:这种格式可以将文件头和代码段的第一页合并起来,这样可以节省空间.它一般会在虚拟地址的最低地址加载一页,来处里NULL地址引起的段错误.

一个典型的a.out文件由一下7部分组成,按顺序有这些段:
exec header:文件头
   这一段中含有一些参数,内核利用其中一些参数来把二进制文件加载到内存中并执行.ld利用另外一些参数来连接其它的二进制文件.这个段是唯一含有命令参数的.

text segment:代码段
   包括在程序执行时加载到内存中的机器码和相关数据.有可能是只读的.

data segment:数据段
   包括初始化过的数据变量.通常是加载到内存中的可写去中.

text relocations:代码重定向
   包含编译连接二进制文件时的记录,这些记录使用来更新代码段中的指针.

data relocations:数据重定向
   和代码重定向相似,区别是它针对于数据段的指针.

symbol table:符号表
   包含连接器对不同二进制文件中的变量,函数和地址之间的对应关系的记录.

string table:字符串表
   包含和符号名字相一致的字符串.

每一种二进制文件都是以这样的一个数据结构开始的:
           struct exec {
                   unsigned long   a_midmag;
                   unsigned long   a_text;
                   unsigned long   a_data;
                   unsigned long   a_bss;
                   unsigned long   a_syms;
                   unsigned long   a_entry;
                   unsigned long   a_trsize;
                   unsigned long   a_drsize;
           };
a_midmag:保存的是主机字节序, I由这些宏来访问其中的部分bit位: N_GETFLAG(), N_GETMID(), N_GETMAGIC(), 由宏 N_SETMAGIC().来设置这个字段.
a_text    代码段的大小Contains the size of the text segment in bytes.

a_data    数据段的大小Contains the size of the data segment in bytes.

a_bss     bss segment中字节数和被内核用来初始化数据段之后的BRK (bss = block started by symbol)//这里的理解还是有点问题

a_syms    符号表的大小

a_entry   保存在程序被内核加载到内存中后程序的起始地址,内核由此地址开始执行程序

a_trsize 代码重定向表的大小

a_drsize 数据重定向表的大小

时间: 2024-10-05 23:46:25

linux下的a.out文件的相关文章

Linux下为何都是文件的理解

所谓“文件”,就是在我们的电脑中,以实现某种功能.或某个软件的部分功能为目的而定义的一个单位. Linux都是以文件的形式存在,当我们访问某个文件(Linux中的文件有目录,连接,普通文本),由于Linux的文件的类型 而区分:如连接文件等,那使用这个文件时,那么就是调用了某个命令: 如普通文本文件时,那么当使用这个文件时,那就是访问该文件的内容 由于文件的类型的不同,从而区别于window系统下的应用:如播放器,EditPlus,浏览器,文件夹等,这些在Linux中都有 对于的不同类型的文件!

Linux下的删除过期文件操作

在实际的软件开发项目中,经常会有实现删除过期文件的需求.即要求程序能够自动删除多长时间之前生成的文件.本文提供了一个示例代码,为相关的开发工作提供了参考. 程序如下(本程序用makefile进行编译): /*********************************************************************** 版权所有 (C)2014, Zhou Zhaoxiong.* * 文件名称: TestFileDelete.c* 内容摘要: 用于演示Linux下过期

Linux下使用vi新建文件保存文件时遇到错误:E212: Can't open file for writing

出现E212: Can't open file for writing的问题是由于权限问题导致的,解决方法有以下思路: 1.使用root进行登录,然后再操作. 2.在使用命令时,前面加sudo. 3.如果是多级文件夹的文件时,由于这个文件夹没有创建,所以要先创建这个文件夹,再来操作这个文件. Linux下使用vi新建文件保存文件时遇到错误:E212: Can't open file for writing

恢复Linux下被误删除的文件(笔记)

恢复Linux下被误删除的文件 [[email protected] ~]# mount /dev/cdrom /mnt/ 分一个区:sda4  查找:extundelete 分一个区:sda4  [[email protected] ~]# mkdir /tmp/sda4 [[email protected] ~]# mkfs.ext4 /dev/sda4     格式化 [[email protected] Desktop]# echo $? 0 [[email protected] ~]#

linux下使用vim替换文件中的^M换行符

在linux下打开windows编辑过的文本,会出现由于换行符不一致而导致的内容格式错乱的问题.最常见的就是出现^M . 我出现的问题是:在windows编辑过的文件,传到linux上后再用vim打开,内容没有换行.也就是所有文件内容都在一行.然后再实际换行的位置多了个^M. 下面的方法是网上搜的.其中dos2unix还有一个相对应的unix2dos 1.使用dos2unix命令.一般的分发版本中都带有这个小工具(如果没有可以根据下面的连接去下载),使用起来很方便: $ dos2unix myf

linux下为目录和文件设置权限,

linux下为目录和文件设置权限,包括子目录的循环递归设置 chmod  命令可以改变所有子目录的权限,下面有2种方法 改变一个文件的权限: chmod mode file|dir 改变所有子目录的权限: chmod mode dir -R                  注意后面加了个-R参数 参数就是权限模式 mode = 777 or 752 ,666,,, mode 的三个数字,分别表示owner,group,others所具有的权限. 1 = x 执行 2 = w 写 4 = r 读

关于在linux下出现stdio.h文件不存在等gcc标准库不能找到的解决办法

首先说明一下我的系统配置:ubuntu 12.04     gcc 4.6.3 有几天没有使用ubuntu了,今天拿出来编程序,刚开始编译一个uboot1.1.6的代码.出现了stdio.h:没有那么个文件或目录的错误,因为我是用的arm-linux-gcc交叉编译编的,所以我刚开始怀疑是不是我的编译器有问题.后来我去编译以前写的一个网络程序 用gcc -o test test.c  然后还是出现了stdio.h:没有那么个文件或目录的错误.然后就各种google,百度.最后的解决方案是: 我的

[转载] linux下打开windows txt文件中文乱码问题

原文链接 在linux操作系统下,我们有时打开在windows下的txt文件,发现在windows下能正常显示的txt文件出现了中文乱码. 出现这种情况的原因为两种操作系统的中文压缩方式不同,在windows环境中中文压缩一般为gbk,而在linux环境中为utf8,这就导致了在windows下能正常显示 txt文件在linux环境下打开呈现了乱码状态. 解决方法:在linux用iconv命令,如乱码文件名为shujujiegou.txt,那么在终端输入如下命令: iconv -f gbk -t

linux下恢复误删除的文件方法(ext2及ext3)

linux下恢复误删除的文件方法(ext2及ext3) 2009-12-19 15:23:47 分类: LINUX 如果是ext2文件系统的,直接用debugfs是可以恢复出来的,但对于ext3,debugfs就无能为力了,好在我们有了ext3grep这个开源工具(http://code.google.com/p/ext3grep/)! 对于ext2 1.在/data(/dev/sdb)上创建并删除测试文件(作测试目的以plantodelete为例) #vi plantodelete 输入Thi

Linux下SSH的Log文件路径

Redhat or Fedora Core: /var/log/secure # Mandrake, FreeBSD or OpenBSD: /var/log/auth.log # SuSE: /var/log/messages # Mac OS X (v10.4 or greater): /private/var/log/asl.log # Mac OS X (v10.3 or earlier): /private/var/log/system.log # Debian: /var/log/a