|

在Linux 0.9x系统中,对于采用静态库连接的执行文件,图中各域注释中括号内的值是该字段的默认值。这种二进制执行文件开始处的4个字节是:
0x0b, 0x01, 0x64, 0x00
而这里的头文件仅定义了魔数域。因此,在Linux 0.1x系统中一个a.out格式的二进制执行文件开始的4个字节是:
0x0b, 0x01, 0x00, 0x00
可以看出,采用GNU的a.out格式的执行文件与Linux 0.1x系统上编译出的执行文件的区别仅在机器类型域。因此我们可以把Linux 0.9x上的a.out格式执行文件的机器类型域(第3个字节)清零,让其运行在0.1x系统中。只要被移植的执行文件所调用的系统调用都已经在0.1x系统中实现即可。在开始重新组建Linux 0.1x根文件系统中的很多命令时,作者就采用了这种方法。
在其他方面,GNU的a.out.h头文件与这里的a.out.h没有什么区别。
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)使用这些参数将一些模块文件组合成一个可执行文件。这是目标文件唯一必要的组成部分。 |
|