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