a.out
扩展名 |
无, .o, .so |
---|---|
开发者 | AT&T |
格式类型 | 二进制文件、执行档、目的码、函式库 |
a.out是旧版类Unix系统中用于执行档、目的码和后来系统中的函式库的一种文件格式,这个名称的意思是汇编器输出。
尽管目前大多数类Unix系统都已改用ELF格式,不再采用a.out格式,但编译器和链接器依然会在用户未指定文件名时,将输出文件取名为“a.out”。[1]
应用
在UNIX第一版中,就出现了给PDP-7和PDP-11用的a.out格式。[2]之后它被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取代了。 [3]Linux之所以转向ELF,或多或少是因为在此平台上构建一个a.out格式的函式库所需的复杂性过高:因为Linux中a.out的ld.so不能重定位共享函式库,所以需要一个中央机构来注册各个函式库的虚拟地址域。[4]一些BSD变体在Linux被迫转向ELF之后仍然用了很久的a.out格式,因为相比于Linux,BSD的a.out略微更灵活一些。[5]由于a.out格式的相关代码已经老旧并缺乏维护,而且已经几乎没有使用a.out格式的存在,5.1版内核决定移除相应的功能支持。[6]
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,一个自由的汇编器
参考资料
- ^ Rupert Wood. What to do with a.out. gcc-help (邮件列表). 2002-04-08 [2007-04-28]. (原始内容存档于2007-02-24).
- ^ Dennis Ritchie. a.out — assembler and link editor output (PDF). Bell Labs. 1971-11-03 [2006-11-24]. (原始内容 (PDF)存档于2006-12-07).
- ^ Daniel Barlow. The Linux ELF HOWTO (v1.29). 14 July 1996 [2008-03-28]. (原始内容存档于2004-07-13).
- ^ Ulrich Drepper. How To Write Shared Libraries (PDF). 4.0. 2006-08-20 [2007-06-20]. (原始内容 (PDF)存档于2007-06-16).
When introducing shared libraries certain design decisions had to be made to work in the limitations of a.out. (...) For all these reasons and more, Linux converted early on to using ELF (Executable Linkage Format) as the binary format.
|section=
被忽略 (帮助) - ^ BSD Myths: BSD uses the a.out executable format, which is outdated technology. [2007-04-10]. (原始内容存档于2007-04-17).
- ^ Borislav Petkov. x86: Deprecate a.out support. 5 March 2019 [5 March 2019]. (原始内容存档于2020-09-19).
Linux supports ELF binaries for ~25 years now. a.out coredumping has bitrotten quite significantly and would need some fixing to get it into shape again but considering how even the toolchains cannot create a.out executables in its default configuration, let's deprecate a.out support and remove it a couple of releases later, instead.