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

问题描述 投票:0回答:2

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

c kernel elf
2个回答
2
投票

首先,您需要了解 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 文件并非设计用于在模糊/新/爱好内核架构上运行。

最初,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 可执行文件并使其与您的内核进行通信,但如果其他方法都不起作用,这应该是您的最后一个选择。


0
投票

即使我也在寻找同样的东西。我想从我的流程的可执行文件中提取文本和数据部分。

© www.soinside.com 2019 - 2024. All rights reserved.