要理解为什么 FreeBSD 使用 elf(5) 格式,您必须首先了解一些 UNIX® 系统中的 三种 “主要” 可执行文件格式的有关知识:
a.out(5)
是最古老和“经典的” UNIX 目标文件格式,这种格式在其文件的开始处有一个短小而又紧凑的首部,该首部带有一个魔幻数字,用来标识具体的格式(更多详情参见a.out(5))。这种格式包含3个要装载入内存的段:.text, .data, 和 .bss,以及一个符号表和一个字符串表。
COFF
SVR3目标文件格式。其文件头现在包括一个区段表(section table),因此除了.text,.data,和.bss区段以外,您还可以包含其它的区段。
elf(5)
COFF 的后继, 其特点是可以有多个区段,并可以使用32位或64位的值。 它有一个主要的缺点: ELF 在其设计时假设每个系统体系结构只有一种 ABI。 这种假设事实上相当错误,甚至在商业化的SYSV世界中都是错误的 (它们至少有三种ABI: SVR4, Solaris, SCO)。
FreeBSD试图在某种程度上解决这个问题,它提供一个工具,可以 对一个已知的ELF可执行文件 标识它所遵从的ABI的信息。 更多这方面的知识可以参见手册页brandelf(1)
FreeBSD从“经典”阵营中来,因此使用了a.out(5)格式,众多BSD版本的发行(直到3.X分支的开始)也证明了这种格式的有效性。虽然在那以前的某段时间,在FreeBSD系统上创建和运行ELF格式的二进制可执行文件(和内核)也是可能的,但FreeBSD一开始并不积极“进步” 到使用ELF作为其缺省的格式。为什么?噢,当Linux阵营完成了转换到ELF格式的痛苦历程后,却发现并不足以由此而放弃 a.out可执行文件格式,因为正是由于它们不灵活的,基于跳转表的共享库机制,使得销售商和开发者们构建共享库非常困难。 直到已有的ELF工具提供了一种解决共享库问题的办法,并被普遍认为是“前进方向”以后,迁徙的代价在FreeBSD界才被接受,并由此完成了迁徙。FreeBSD的共享库机制其基础更类似于Sun SunOS™的共享库机制, 并且正因为此,其易用性很好。
|