我有几个问题:
- 为何
a.out
取而代之ELF
? - a.out格式中导致ELF文件格式增加的主要缺陷是什么?
- 早期的核心转储基于a.out,但现在它们基于ELF。 ELF提供的各种优势是什么?
我有几个问题:
a.out
取而代之 ELF
?该 a.out
格式强制共享库占用内存中的固定位置。如果要分发a.out共享库,则必须注册其地址空间。这对性能有好处,但根本没有扩展。你自己看 它是多么棘手 (linuxjournal)。
相比之下,在ELF中,共享库可以加载到内存中的任何位置,甚至可以显示在同一台计算机上运行的不同应用程序的不同地址(代码仍然只在物理内存中的一个位置有效加载)!为了实现这一点,在IA-32架构中,必须牺牲寄存器(%ebx)。 更全面的参考 显示共享库在ELF中变得更复杂,但这是编译器方面的复杂性,而不是程序员方面。
有点琐碎 - a.out代表Assembler OUTput,直到今天,gcc将编译C代码并默认命名输出文件a.out,除非指定了另一个输出名称,尽管输出文件仍然是ELF。这是从代码直接翻译成汇编程序输出的日子的延续......很高兴看到遗留在精神上的遗产!
希望这可以帮助, 最好的祝福, 汤姆。
我记得,a.out格式的一个原始问题是它只支持三个部分:text,data和bss。 ELF允许任何数字(或至少更多)。 a.out标头格式非常简单,如:
word <magic>
word <text size>
word <data size>
word <bss size>
相比之下,ELF格式具有节标题,包括名称,大小等。
如果我们需要,有更多的部分允许标准部分,但也给我们const部分,构造函数部分,甚至每个函数一个部分。