我希望你们能帮助我理解重定位条目和 ELF 部分数据是如何关联的,以及它们是如何处理和生成的。
我有一个古老的不受支持的工具,它采用 ELF 文件和相关的 PLF 文件(部分链接文件,在构建过程的早期生成),并从中构建一个自定义可重定位文件,该文件在内存限制严格的平台 (PPC) 上使用。这工作得很好,除了它包含大约一兆我们要在启动后卸载的初始化代码。因此,我们将所有初始化代码放在自定义部分中以便卸载它,但不幸的是,该工具无法正确处理自定义部分并且 rel 文件无效。因此,我的任务是制作一个新工具,可以正确生成此可重定位文件,其中包含自定义部分。
我已经使用这个工具并生成了 rel 文件,但目前陷入困境,试图弄清楚如何处理部分数据并构建重定位条目等。我是一名高级程序员,摆脱了我的束缚。这个任务的元素,所以所有这些逆向工程业务对我来说都是新的(感谢上帝的互联网!)。
I found 精灵夏普 http://antmicro.com/projects/elfsharp/index.shtml并以此为起点。它允许我加载 ELF 和 PLF 文件并与其内容进行交互。从那里,我对重定位文件的标头和内容的大部分进行了逆向工程,但它远非准确。当我将旧工具的文件版本与我的文件版本进行比较时,我发现一些部分数据已被修复,而我的文件使用直接来自 PLF 文件的部分数据并且是简单的。我的意思是我复制的部分数据包含大量“48 00 00 01”,但这些都是由旧工具以某种方式修复的。这些字节的意义是什么?对它们做了什么?我还必须生成重定位条目,但不确定如何继续。
我在网上找到了一些处理精灵重定位的示例,并且我的工具中也有类似的东西,但我仍然不清楚我到底应该做什么。我有一个关于所有重定位类型及其公式的良好资源(第 4.12.5 章)here https://www.power.org/wp-content/uploads/2012/07/Power-Arch-32-bit-ABI-supp-1.0-Embedded.pdf),但我仍然不太确定我应该使用什么偏移量、部分信息等。
TL;DR
您能帮我想象一下这些重定位条目到底发生了什么,它是如何生成和处理的,以及在程序执行时如何使用它的吗?
对段数据中的所有“48 00 00 01”字做了什么?我假设它们已经用适当的符号解决了,但是这是如何完成的呢?使用.rela 信息?
另外,我不确定何时应该使用 PLF 内容以及何时应该使用 ELF 内容。我想我只需要ELF来获取加载地址和段信息。
当我生成重定位修正(在 PPC 上)时,如何准确评估重定位类型方程?我在网上提到的例子在这一点上并不直观。我对偏移量感到困惑 - 您从 Elf32_Rela 获得了一个偏移量,但这就是您修改的偏移量吗?用于记录修复结果的偏移量是多少?加数到底是什么?我在网上没有找到任何有启发性的东西。
一些(实际上是大多数)重定位修复指向几个 .debug_ 之一*部分或.bss。我应该跳过 .debug 修复还是这些修复很重要? .bss 是 NoBits 部分,那么我该如何处理呢?当涉及到实际生成重定位条目时,我了解它们是如何构造的,但实际上是谁/什么在制作这些条目?我的意思是,我已经准备好构建它,但我不知道从哪里开始 - 我是否要在某个地方迭代一些数据或者什么?
还有其他我应该问但尚未意识到的问题吗? ;)
感谢您阅读我的冗长问题!
也许 objconv 工具可以提供帮助。它可以将 x86 ELF 文件中的重定位类型显示为转储或反汇编。http://www.agner.org/optimize/#objconv http://www.agner.org/optimize/#objconv
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)