为什么ELF magic number中没有16位信息?

Why there is no 16-bit information in ELF magic number?

在ELF-header中,e_ident[EI_CLASS]的值可以是1或2,表示32位操作系统或64位操作系统。但是从历史上我们知道,ELF最早出现在1993年发布的Solaris 2.0中。然而,广泛使用的32位处理器Pentium Pro直到1995年才出现。 那么为什么ELF头没有16位甚至8位的信息呢?

第一个 "widely used" 32 位 CPU 是 Intel 80386,它要老得多。

然后我们有关于 SUN 及其 SPARC 架构的故事,时间框架与 386 大致相同。

Solaris 是 SUN 在 1990 年代早期为其机器开发的,接近第一个 64 位系统实际开始出现的时间。

ELF(Executable and Linkable Format) was developed in the late 1980's, when all major Unix variants ran on pure or hybrid (think Motorola 68000)32位系统的缩写。

EI_CLASS 不识别 "operating system",而是识别内存模型。此设置定义文件中各种地址信息的编码方式,不一定是目标寄存器的宽度。

对于 PC CPUs,代码加载器在将执行 ELF 文件中包含的程序的同一 CPU 上执行,因此 EI_CLASS 与代码格式匹配。然而,ELF 文件也用作可移植代码/调试格式,即使在 8 位和 16 位控制器上也是如此。此外,几乎所有 16 位 CPU 都可以寻址超过 64 KB 的内存,因此对于此类目标,EI_CLASS 不能设置为 ELFCLASS16(假设存在这样的 class ).

综上所述,指针的位宽并不重要,重要的是你可以拥有多少虚拟内存。当然,仍然可以通过定义 ELFCLASS20(16 位 CPUs 的通用值,包括 Intel 8086)之类的东西来使 ELF 文件更紧凑,但是,就像已经说过的那样,32-位架构在 1993 年就已经很普遍了,所以没有人费心去定义这样的东西。