我希望你们能帮助我理解重定位条目和ELF部分数据是如何相关的,以及它是如何处理和生成的。
我有一个古老的不受支持的工具,它接受一个ELF文件和一个相关的PLF文件(部分链接文件,在构建过程的早期生成)并从中构建一个自定义的可重定位文件,用于平台(PPC)上记忆约束。这工作正常,除了它包含我们想要在启动后卸载的大量初始化代码。因此,我们将所有init代码放在自定义部分中以便卸载它,但遗憾的是,该工具无法正确处理自定义部分,并且rel文件无效。所以我的任务是创建一个新工具,正确生成这个可重定位文件,其中包含自定义部分。
我已经使用这个工具相对较远并生成了rel文件,但我目前陷入困境,试图找出如何处理节数据并构建重定位条目等。我是一个高级程序员方式出于这个任务我的元素,所以所有这些逆向工程业务对我来说都是新的(谢天谢地!)。
我找到Elf Sharp并将其作为起点。它允许我加载ELF和PLF文件并与其内容进行交互。从那里开始,我在很大程度上反向设计了重定位文件的标题和内容,但它远非准确。当我将旧工具的文件版本与我的文件进行比较时,我发现某些部分数据已被修复,而我的文件直接使用PLF文件中的部分数据而且很简单。我的意思是我复制的部分数据包含大量的“48 00 00 01”,但这些都是旧工具以某种方式修复的。这些字节的重要性是什么,以及对它们做了什么?我还必须生成重定位条目,但我不确定如何继续。
我找到了一些在线处理精灵重新定位的例子,我的工具中有类似的东西,但是我还不清楚究竟应该做什么。我有一个很好的资源用于所有重定位类型及其公式(第4.12.5章here),但我仍然不太确定我应该使用的偏移量,部分信息等。
TL; DR
您能否帮我看一下这些重定位条目究竟发生了什么,它是如何生成和处理的,以及程序执行时的使用方式?
对截面数据中的所有“48 00 00 01”字进行了哪些操作?我假设他们已经用适当的符号解决了,但这是怎么做到的?使用.rela信息?
另外,我不确定何时应该使用PLF内容以及何时应该使用ELF内容。我想我只需要ELF来获取加载地址和段信息。
当我生成重定位修正(在PPC上)时,我究竟如何评估重定位类型方程?我在网上提到的例子在这一点上并不直观。我对偏移感到困惑 - 你从Elf32_Rela得到一个,但是你修改的那个?用于记录修正结果的偏移量是多少?加数究竟是什么?我没有在网上找到任何有启发性的内容。
一些(实际上大多数)重定位修正指向了几个.debug_ * 部分或.bss中的一个。我应该跳过.debug修正案还是重要的? .bss是一个NoBits部分,所以我该如何处理呢?当涉及到实际生成重定位条目时,我理解它们是如何构建的,但实际上是在制作条目的背后是谁/什么?我的意思是,我已经准备好构建它,但我不知道从哪里开始 - 我是否在某处迭代某些数据或者什么?
我应该问的任何其他问题但还没有意识到吗? ;)
感谢您阅读我冗长的问题!
答案 0 :(得分:0)
也许objconv工具可以提供帮助。它可以将x86 ELF文件中的重定位类型显示为转储或反汇编。 http://www.agner.org/optimize/#objconv