3

我希望你们能帮助我了解重定位条目和 ELF 部分数据是如何相关的,以及它们是如何处理和生成的。

我有一个古老的不受支持的工具,它获取一个 ELF 文件和一个相关的 PLF 文件(部分链接的文件,在构建过程的早期生成),并从中构建一个自定义的可重定位文件,该文件在具有严格内存限制的平台 (PPC) 上使用。这很好用,只是它包含大约一兆的初始化代码,我们要在启动后卸载。因此,我们将所有初始化代码放在自定义部分中以便卸载它,但不幸的是,该工具无法正确处理自定义部分并且 rel 文件无效。所以我的任务是制作一个新工具,可以正确生成这个包含自定义部分的可重定位文件。

我在使用这个工具和生成 rel 文件方面已经取得了相对较远的进展,但目前我陷入了试图弄清楚如何处理部分数据和构建重定位条目等方面的困境。我是一个高级程序员,摆脱了我的这个任务的元素,所以所有这些逆向工程业务对我来说都是新的(感谢互联网!)。

我找到了Elf Sharp,并以此为起点。它允许我加载 ELF 和 PLF 文件并与它们的内容进行交互。从那里,我对重定位文件的标题和内容进行了逆向工程,但它远非准确。当我将旧工具的文件版本与我的文件进行比较时,我发现一些部分数据已被修复,而我的文件直接使用 PLF 文件中的部分数据并且是普通的。我的意思是我复制的部分数据包含大量“48 00 00 01”,但这些都是由旧工具以某种方式修复的。这些字节的意义是什么,对它们做了什么?我还必须生成重定位条目,但不确定如何继续。

我在网上找到了一些处理精灵重定位的例子,我的工具中有类似的东西正在运行,但我仍然不清楚我到底应该做什么。对于所有重定位类型及其公式(此处为第 4.12.5 章),我都有很好的资源,但我仍然不太确定应该使用哪些偏移量、部分信息等。

TL;博士

  • 你能帮我想象一下这些重定位条目到底发生了什么,它是如何生成和处理的,以及它在程序执行时是如何使用的?

  • 对section数据中所有的“48 00 00 01”字做了什么?我假设他们已经用适当的符号解决了,但是这是怎么做的呢?使用 .rela 信息?

  • 另外,我不确定什么时候应该使用 PLF 内容,什么时候应该使用 ELF 内容。我想我只需要 ELF 来获取加载地址和段信息。

  • 当我生成重定位修正(在 PPC 上)时,我如何准确地评估重定位类型方程?我在网上提到的例子在这一点上并不直观。我对偏移量感到困惑——你从 Elf32_Rela 得到一个,但那是你修改的那个吗?用于记录修复结果的偏移量是多少?加数究竟是什么?我还没有在网上找到任何有启发性的东西。

  • 一些(实际上是大多数)重定位修复指向几个 .debug_ *节或 .bss 之一。我应该跳过 .debug 修复还是那些很重要?.bss 是 NoBits 部分,那么我该如何处理呢?当涉及到实际生成重定位条目时,我了解它们是如何构造的,但实际上是谁/是什么在制作这些条目?我的意思是,我已经准备好构建它,但我不知道从哪里开始——我是在某处迭代一些数据还是什么?

  • 还有其他我应该问但尚未意识到的问题吗?;)

感谢您阅读我冗长的问题!

4

1 回答 1

1

也许 objconv 工具可以提供帮助。它可以将 x86 ELF 文件中的重定位类型显示为转储或反汇编。 http://www.agner.org/optimize/#objconv

于 2017-04-12T10:53:30.377 回答