我正在尝试用 C 创建一个内核,我想知道如何解析 ELF 代码。关于我可以在哪里学习如何制作 ELF 解析器有什么建议吗?
维基百科有一篇关于 ELF 文件的精彩文章。所有 ELF 格式/布局都可以在这里找到:https://en.wikipedia.org/wiki/Executable_and_Linkable_Format#File_layout
您还可以使用 GNU Binutils 中包含的名为
readelf
的工具,因此如果您使用的是 Linux,则应该预先安装它。虽然readelf
不是一个解析器,但它更多的是一个精灵信息阅读器。它可能有助于参考目的,看看您是否走在正确的道路上。
或者,您也可以使用
objdump
,它也具有相同的作用。
如果您使用的是 C/C++,有一个名为
elf.h
的头文件可以为您处理 elf 文件。我还没有阅读 linux 手册页 上的所有文档,但它应该在某种程度上对您的情况有用。
最初,ELF 文件被设计为在 UNIX 系统或性质相似的系统上运行。在 ELF 标头中,有一个称为 OSABI 的值(位于开头的第 7 个字节),它指定 ELF 文件的 ABI。 ELF 标准当前版本支持少数系统。这是完整的表格:
价值 | 阿比 |
---|---|
0x00 | 系统V |
0x01 | HP-UX |
0x02 | NetBSD |
0x03 | Linux |
0x04 | GNU 赫德 |
0x06 | 索拉里斯 |
0x07 | AIX |
0x08 | IRIX |
0x09 | FreeBSD |
0x0A | Tru64 |
0x0B | Novell 莫德斯托 |
0x0C | OpenBSD |
0x0D | 开放VMS |
0x0E | 不间断内核 |
0x0F | 阿罗斯 |
0x10 | Fenix操作系统 |
0x11 | 云ABI |
0x12 | Stratus 技术 OpenVOS |
但是,这并不意味着不可能让它在您自己的内核上运行,但是在 ELF 标准不支持的完全不同的系统上做到这一点是众所周知的困难。我还没有设计任何内核,更不用说对内核如何工作有足够的了解,但是 ELF 二进制文件中有一些值范围支持自定义系统(例如您的系统)。这包括诸如标头中的对象文件类型、程序标头中的段类型以及最后段标头中的标头类型和节属性等字段。
您可以创建一个小型虚拟机来模拟 ELF 可执行文件并使其与您的内核进行通信,但如果其他方法都不起作用,这应该是您的最后一个选择。
即使我也在寻找同样的东西。我想从我的流程的可执行文件中提取文本和数据部分。