我如何能够在 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 并使其与您的内核通信,但如果没有其他方法,这应该是您最后的选择。
我正在尝试用 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 并使其与您的内核通信,但如果没有其他方法,这应该是您最后的选择。