问题 a.out被ELF文件格式取代?


我有几个问题:

  • 为何 a.out 取而代之 ELF
  • a.out格式中导致ELF文件格式增加的主要缺陷是什么?
  • 早期的核心转储基于a.out,但现在它们基于ELF。 ELF提供的各种优势是什么?

3918
2018-02-28 19:45


起源

你自己做过研究吗?你没说出你抬头的东西等等...... - t0mm13b
是的,我做了一些研究 en.wikipedia.org/wiki/A.out- “由于在该平台上构建a.out共享库的复杂性,Linux向ELF的过渡或多或少被迫,其中包括需要向中央机构注册库所在的虚拟地址空间,如a Linux中的.out ld.so无法重新定位共享库。由于BSD a.out的一些更灵活的特性,各种BSD风格能够在Linux被迫切换到ELF之后很久才能继续使用a.out二进制文件。格式与Linux相比“。 - Karthik Balaguru


答案:


a.out 格式强制共享库占用内存中的固定位置。如果要分发a.out共享库,则必须注册其地址空间。这对性能有好处,但根本没有扩展。你自己看 它是多么棘手 (linuxjournal)。

相比之下,在ELF中,共享库可以加载到内存中的任何位置,甚至可以显示在同一台计算机上运行的不同应用程序的不同地址(代码仍然只在物理内存中的一个位置有效加载)!为了实现这一点,在IA-32架构中,必须牺牲寄存器(%ebx)。 更全面的参考 显示共享库在ELF中变得更复杂,但这是编译器方面的复杂性,而不是程序员方面。


15
2018-02-28 20:06



我会感兴趣的是知道ebx之前和之后是如何使用的,以及coff与elf的不同之处 - Evan Carroll
@EvanCarroll原始问题根本没有提到COFF。您的评论听起来像是一个新问题,我邀请您提问。 - Pascal Cuoq
@EvanCarroll在a.out中,ebx可用作用户代码作为通用寄存器。在x86(32位)ELF ABI中,ebx保存全局偏移表(GOT)的地址,因此不能用于用户代码。叶函数 - 不调用任何其他函数的函数 - 可以保存并使用它,但与被调用者保存寄存器不同,它不足以将其保存在条目中以便能够一般地使用它。 - Pascal Cuoq


有点琐碎 - a.out代表Assembler OUTput,直到今天,gcc将编译C代码并默认命名输出文件a.out,除非指定了另一个输出名称,尽管输出文件仍然是ELF。这是从代码直接翻译成汇编程序输出的日子的延续......很高兴看到遗留在精神上的遗产!

希望这可以帮助, 最好的祝福, 汤姆。


1
2018-02-28 19:56



请注意,虽然gcc默认使用该名称 a.out,格式仍然是ELF。 - hlovdal
@hlovdal:真的! :) - t0mm13b
谁投了这个?显然,downvoter不明白!请对它发表评论...并且不要盲目地低估和 不 发表评论! - t0mm13b
-1:不是答案 - anatolyg


我记得,a.out格式的一个原始问题是它只支持三个部分:text,data和bss。 ELF允许任何数字(或至少更多)。 a.out标头格式非常简单,如:

word <magic>
word <text size>
word <data size>
word <bss size>

相比之下,ELF格式具有节标题,包括名称,大小等。

如果我们需要,有更多的部分允许标准部分,但也给我们const部分,构造函数部分,甚至每个函数一个部分。


0
2018-02-28 19:53



这解释了差异,但没有解释a.out的错误或为什么有更多的部分更好 - Andreas Bonini