我有几个问题:
- 为什么被
a.out
替换了ELF
? - 导致 ELF 文件格式兴起的 a.out 格式的主要缺陷是什么?
- 早期的核心转储基于 a.out,但现在它们基于 ELF。ELF提供的各种优势是什么?
我有几个问题:
a.out
替换了ELF
?该a.out
格式强制共享库在内存中占据固定位置。如果你想分发一个 a.out 共享库,你必须注册它的地址空间。这对性能有好处,但根本无法扩展。亲眼看看它有多么棘手(linuxjournal)。
相比之下,在 ELF 中,共享库可以加载到内存中的任何位置,甚至对于在同一台计算机上运行的不同应用程序而言,它们甚至可以位于不同的地址(代码仍然有效地加载到物理内存中的一个位置)!为了实现这一点,在 IA-32 架构中,必须牺牲一个寄存器 (%ebx)。更全面的参考资料显示共享库在 ELF 中变得更加复杂,但这是编译器端的复杂性,而不是程序员端的复杂性。
我记得,a.out 格式的原始问题之一是它只支持三个部分:文本、数据和 bss。ELF 允许任何数量(或至少更多)。a.out 标头格式非常简单,例如:
word <magic>
word <text size>
word <data size>
word <bss size>
相比之下,ELF 格式具有节标题,包含名称、大小等。
拥有更多节允许标准节,但也为我们提供 const 节、构造函数节,甚至每个函数一个节,如果我们想要的话。