14.2.2 代码注释附件下载,pdf格式)程序14.pdf

14.2.3 a.out执行文件格式

Linux内核0.12版仅支持a.out(Assembly out)执行文件和目标文件的格式,虽然这种格式目前已经渐渐不用,而使用功能更为齐全的ELF(Executable and Link Format)格式,但是由于其简单性,作为入门的学习材料比较适用。下面全面介绍一下a.out格式。

在头文件a.out.h中声明了三个数据结构以及一些宏。这些数据结构描述了系统上目标文件的结构。在Linux 0.12系统中,编译产生的目标模块文件(简称模块文件)和链接生成的二进制可执行文件均采用a.out格式。这里统称为目标文件。一个目标文件由7部分(7节)组成。它们依次为:

(1)执行头部分(exec header)。该部分中含有一些参数(exec结构),内核使用这些参数把执行文件加载到内存中并执行,而链接程序(ld)使用这些参数将一些模块文件组合成一个可执行文件。这是目标文件唯一必要的组成部分。

(2)代码段部分(text segment)。含有程序执行时被加载到内存中的指令代码和相关数据。可以以只读形式被加载。

(3)数据段部分(data segment)。这部分含有已经初始化过的数据,总是被加载到可读写的内存中。

(4)代码重定位部分(text relocations)。这部分含有供链接程序使用的记录数据。在组合目标模块文件时用于定位代码段中的指针或地址。

(5)数据重定位部分(data relocations)。类似于代码重定位部分的作用,但是用于数据段中指针的重定位。

(6)符号表部分(symbol table)。这部分同样含有供链接程序使用的记录数据,用于在二进制目标模块文件之间对命名的变量和函数(符号)进行交叉引用。

(7)字符串表部分(string table)。该部分含有与符号名对应的字符串。

每个目标文件均以一个执行数据结构(exec structure)开始。该数据结构的形式如下:

Linux内核完全剖析---头文件

各个字段的功能如下:

1)a_magic——该字段含有三个子字段,分别是标志字段、机器类型标识字段和魔数字段,参见图11-1。不过对于Linux 0.12系统其目标文件只使用了其中的魔数子字段,并使用宏N_MAGIC()来访问,它唯一地确定了二进制执行文件与其他加载的文件之间的区别。该子字段中必须包含以下值之一:

◆OMAGIC。表示代码和数据段紧随在执行头后面并且是连续存放的。内核将代码和数据段都加载到可读写内存中。编译器编译出的目标文件的魔数是OMAGIC(八进制0407)。

◆NMAGIC。同OMAGIC一样,代码和数据段紧随在执行头后面并且是连续存放的。然而内核将代码加载到了只读内存中,并把数据段加载到代码段后下一页可读写内存边界开始。

◆ZMAGIC。内核在必要时从二进制执行文件中加载独立的页面。执行头部、代码段和数据段都被链接程序处理成多个页面大小的块。内核加载的代码页面是只读的,而数据段的页面是可写的。链接生成的可执行文件的魔数即是ZMAGIC(0413,即0x10b)。

2)a_text——该字段含有代码段的长度值,字节数。

3)a_data——该字段含有数据段的长度值,字节数。

4)a_bss——含有bss段的长度,内核用其设置在数据段后初始的break(brk)。内核在加载程序时,这段可写内存显现出处于数据段后面,并且初始时为全零。

5)a_syms——含有符号表部分的字节长度值。

6)a_entry——含有内核将执行文件加载到内存中以后,程序执行起始点的内存地址。

7)a_trsize——该字段含有代码重定位表的大小,是字节数。

8)a_drsize——该字段含有数据重定位表的大小,是字节数。


相关内容