A.out

a.out是旧版类Unix系统中用于执行档、目的码和后来系统中的函式库的一种文件格式,这个名称的意思是汇编器输出

尽管目前大多數类Unix系统都已改用ELF格式,不再采用a.out格式,但编译器和链接器依然会在用户未指定文件名时,将输出文件取名为“a.out”。

应用
在UNIX第一版中,就出现了给PDP-7和PDP-11用的a.out格式。之后它被UNIX System V中的COFF所取代,而COFF最后也被SVR4中的ELF格式所取代。

尽管BSD曾经沿用了一段时间的a.out格式,但较新的BSD系统都已切换到ELF。NetBSD/i386在1.5版中正式从a.out切换到ELF,FreeBSD/i386则是在2.2到3.0的转换中切换到ELF的。

a.out格式对调试信息的支持是由符号表中称作“stabs”的特殊项实现的。许多COFF和ELF变体中也用到了stabs格式。

Linux在1.2版内核之前也曾使用a.out格式(实验性的1.1.52版中加入了对ELF的支持),在此之后也被ELF取代了。 Linux之所以转向ELF,或多或少是因为在此平台上构建一个a.out格式的函式库所需的复杂性过高:因为Linux中a.out的ld.so不能重定位共享函式库,所以需要一个中央机构来注册各个函式库的虚拟地址域。一些BSD变体在Linux被迫转向ELF之后仍然用了很久的a.out格式,因为相比于Linux,BSD的a.out略微更灵活一些。由于a.out格式的相关代码已经老旧并缺乏维护,而且已经几乎没有使用a.out格式的存在,5.1版内核决定移除相应的功能支持。

MINIX 3仍将a.out作为二进制文件的格式,但其不支持共享函式库。

格式
a.out执行档通常是以下几种变体之一:OMAGIC、NMAGIC、QMAGIC或ZMAGIC。
; OMAGIC
: OMAGIC格式在文件头后有连续段,没有文本和数据的分离。也被用作目标文件格式。
; NMAGIC
: NMAGIC格式与OMAGIC相像,但数据段出现在文本段结束后的下一页,且文本段被标为只读。
; ZMAGIC
: ZMAGIC格式加入了对按需分页的支持,代码段和数据段的长度需要是页宽的整数倍。
; QMAGIC
: QMAGIC二进制文件通常被加载在虚拟地址池的底端,用以通过段错误捕获对空指针的解引用。a.out头部与文本段的第一页合并,通常会省下一页的内存。
; CMAGIC
: 旧版的Linux使用此格式来存放核心转储。

a.out文件包含至多七节,顺序如下:
; 执行头部
: 包含内核将二进制文件加载入内存并执行所需的参数,也包含对动态链接器ld的指引。仅有本节是必须出现的。
; 文本段
: 包含运行时被载入内存的机器码和相关数据,可能是只读的。
; 数据段
: 包含已初始化的数据,总是可写的。
; 文本重定位
: 包含链接编辑器在合并二进制文件时修改文本段指针的记录。
; 数据重定位
: 与文本重定位一节类似,但是给数据段指针用的。
; 符号表
: 包含链接编辑器用于交叉引用不同二进制文件中变量和函式(符号)的记录。
; 字符串表
: 包含对应于符号表的字符串。

参见

  • Portable Executable
  • ELF
  • Vasm,一个自由的汇编器

参考资料
外部链接

评论 (0)

  • 还没有评论,来抢沙发吧。