linux下的a.out文件

 
 当然这里,我更重要的是强调这个什么段,什么段。这以前就知道。但其实是对一个可以执行的c语言程序的分析。就好比你分析一篇作文。有标题。有段落。

.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 数据重定向表的大小
posted @ 2016-10-16 20:48  张飞online  阅读(22712)  评论(0编辑  收藏  举报