a.out被ELF文件格式替换了吗?

14

我有几个问题:

  • 为什么a.outELF替代了?
  • a.out格式的主要缺陷是什么导致了ELF文件格式的崛起?
  • 早期的核心转储基于a.out,但现在它们基于ELFELF提供了哪些各种优势?
2个回答

20

a.out格式强制共享库占用内存中的固定位置。如果您想要分发a.out共享库,您必须注册其地址空间。这对性能有好处,但根本不可扩展。请查看此处(linuxjournal)。

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


2
有点琐碎 - a.out代表汇编器输出,直到今天,gcc将编译C代码并默认将输出文件命名为a.out,除非指定另一个输出名称,尽管输出文件仍然是ELF。这是从将代码直接转换为汇编器输出的日子中保留下来的...很高兴看到遗留精神仍然存在! - t0mm13b
请注意,尽管gcc默认使用名称a.out,但格式仍为ELF。 - hlovdal
我对了解ebx在之前和之后的使用方式以及coff与elf有何不同都很感兴趣。 - Evan Carroll
@EvanCarroll 原始问题根本没有涉及 COFF。您的评论听起来像是一个新问题,我邀请您提出。 - Pascal Cuoq
@EvanCarroll 在 a.out 中,ebx 作为通用寄存器对用户代码可用。在 x86(32位)ELF ABI 中,ebx 保存全局偏移表(GOT)的地址,因此不可用于用户代码。叶子函数 - 不调用任何其他函数的函数 - 可以保存并使用它,但与被调用者保存的寄存器不同,仅在进入时保存它是不足以在一般情况下使用它的。 - Pascal Cuoq

2

据我回忆,a.out格式最初的一个问题是它只支持三个部分:文本、数据和bss。ELF允许任意数量(或至少更多)。a.out头文件格式非常简单,类似于:

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

相比之下,ELF格式具有带有名称、大小等的节头。

拥有更多的节允许我们使用标准节,但也可以为我们提供常量节、构造器节,甚至每个函数一个节,如果我们需要的话。


2
这解释了差异,但并没有解释为什么a.out有问题或者为什么拥有更多的节(section)更好。 - Andreas Bonini

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接