我如何能够在 C 中为我的内核解析 ELF 格式?

How would I be able to parse ELF format for my kernel in C?

我正在尝试用 C 语言创建内核,我想知道如何解析 ELF 代码。关于我在哪里可以学习如何制作 ELF 解析器有什么建议吗?

首先,您需要了解 ELF 文件的工作原理。

维基百科有一篇关于 ELF 文件的精彩文章。所有 ELF format/layout 都可以在这里找到:https://en.wikipedia.org/wiki/Executable_and_Linkable_Format#File_layout

您还可以使用 GNU Binutils 中包含的名为 readelf 的工具,因此如果您使用 linux,则应预先安装该工具。虽然readelf不是一个解析器,但它更像是一个精灵信息reader。它可以作为参考,看看您是否在正确的轨道上。

或者,您可以使用 objdump,它的作用也相同。

如果您使用的是 C/C++,则有一个名为 elf.h 的 header 文件可以为您处理 elf 文件。我还没有阅读有关 linux manual page 的所有文档,但它应该在某种程度上对您的情况有用。

ELF 文件并非设计用于运行 obscure/new/hobby 内核架构。

最初,ELF 文件被设计为 运行 在 UNIX 系统或性质相似的系统上。在ELF header 中,有一个名为OSABI 的值(在开头的第7 个字节),它指定了ELF 文件的ABI。 ELF 标准在当前版本中支持少数系统。这是完整的 table:

value ABI
0x00 System V
0x01 HP-UX
0x02 NetBSD
0x03 Linux
0x04 GNU Hurd
0x06 Solaris
0x07 AIX
0x08 IRIX
0x09 FreeBSD
0x0A Tru64
0x0B Novell Modesto
0x0C OpenBSD
0x0D OpenVMS
0x0E NonStop Kernel
0x0F AROS
0x10 Fenix OS
0x11 CloudABI
0x12 Stratus Technologies OpenVOS

然而,这并不意味着不可能在您自己的内核上实现 运行,但众所周知,在 ELF 标准不支持的完全不同的系统上实现它是非常困难的。我还没有设计任何内核,更不用说对内核的工作原理有足够的了解了,但是 ELF 二进制文件中有一些价值 运行ges 支持自定义系统,例如您的系统。这包括 header 中的 object 文件类型、程序 header 中的段类型以及段 header 中的类型和节属性等字段40=].

您可以创建一个小型虚拟机来模拟 ELF executable 并使其与您的内核通信,但如果没有其他方法,这应该是您最后的选择。