返回介绍

4.3 解析 ELF 文件

发布于 2024-10-10 22:32:15 字数 2319 浏览 0 评论 0 收藏 0

上面介绍了 ELF 文件格式资料、解析 ELF 文件的工具,下面就来实际操作一下,用 Java 代码动手解析一个 libhello-jni.so 文件。这个 libhello-jni.so 文件可以下载。

提示:libhello-jni.so 下载地址:

http://download.csdn.net/detail/jiangwei0910410003/9204087

1.定义 ELF 文件中各个结构体内容

这需要参考 elf.h 这个头文件的格式,这个文件在 Android 源码目录中:

在看 elf.h 文件中定义的数据结构时,要记得每个字段的占用字节数就可以了。

有了结构定义,下面就来看看如何解析吧。在解析之前需要将 so 文件读取到 byte[]中,定义一个数据结构类型:

2.解析 ELF 文件的头部信息

文件的最开始几个字节给出如何解释文件的提示信息。这些信息独立于处理器,也独立于文件中的其余内容。ELF 头部信息数据结构如下表示:

这里介绍几个重要的字段,后面修改 so 文件的时候也会用到:

·e_phoff:是程序头(Program Header)内容在整个文件的偏移值,可以用这个偏移值来定位程序头的开始位置,用于解析程序头信息。

·e_shoff:是段头(Section Header)内容在这个文件的偏移值,可以用这个偏移值来定位段头的开始位置,用于解析段头信息。

·e_phnum:是程序头的个数。

·e_shnum:是段头的个数。

·e_shstrndx:是 String 段在整个段列表中的索引值,用于后面定位 String 段的位置。

参照图 4-1 可以很容易解析下面代码:

按照对应的每个字段的字节个数,读取字节就可以了。

3.解析段头信息

每个段头部可以用如下数据结构描述:

这个结构中字段就不做解释了。后面会手动构造这样一个数据结构,到时候再详细说明每个字段含义。

按照这个结构,解析也简单了:

这里需要注意的是,看到的 SectionHeader 一般都是多个的,所以这里用一个 List 集合来保存。

4.解析程序头信息

可执行文件或者共享目标文件的程序头部是一个结构数组,每个结构描述了一个段或者系统准备程序执行所必需的其他信息。目标文件的“段”包含一个或者多个“节区”,也就是“段内容”(Segment Contents)。程序头部仅对可执行文件和共享目标文件有意义。可执行目标文件在 ELF 头部的 e_phentsize 和 e_phnum 成员中给出其自身程序头部的大小。

程序头部的数据结构如下:

按照这个结构来进行解析,如下所示:

当然还有其他结构的解析工作,这里就不一一介绍了,因为这些结构在后面的介绍中不会用到,这里只需了解一下。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文