我希望您能帮助我了解重定位条目和ELF部分数据之间的关系,以及它们是如何处理和生成的。
我有一个古老的不支持工具,可以使用ELF文件和相关的PLF文件(在先前的构建过程中生成)构建自定义可重定位文件,该文件用于具有紧密内存限制的平台(PPC)。这很好用,但它包含约1兆字节的初始化代码,我们想要在启动后卸载它。因此,我们将所有的初始化代码放在自定义节中以便卸载它,但不幸的是,该工具无法正确处理自定义节,因此rel文件无效。所以我的任务是开发一个新工具,正确生成包含自定义节的可重定位文件。
我已经在开发这个工具方面做得相当好,并生成了rel文件,但目前正陷入困境,试图弄清楚如何处理部分数据并构建重定位条目等。作为一名高级程序员,这项任务使我感到非常不适应,所以这些反向工程的业务对我来说都是新的领域(谢天谢地有互联网!)。
我找到了Elf Sharp,并以此作为起点。它允许我加载ELF和PLF文件,并与它们的内容交互。从那里开始,我逆向工程了重定位文件的头和内容,但仍远未准确。当我将旧工具版本的文件与我的文件进行比较时,我发现一些部分数据已被修复,而我的文件使用直接从PLF文件中复制的部分数据并且是空的。我的意思是我复制过来的节数据包含大量的“48 00 00 01”,但这些在旧工具中都被修复了。这些字节的意义是什么,以及正在做什么?我还必须生成重定位条目,但不确定如何继续。
我在网上找到了一些处理elf重定位的示例,并且我在我的工具中有类似的东西正在运行,但我仍然对我应该做什么不太清楚。我有关于所有重定位类型及其公式的良好资源(第4.12.5章此处),但我仍然不确定该使用哪些偏移量、部分信息等。
我有一个古老的不支持工具,可以使用ELF文件和相关的PLF文件(在先前的构建过程中生成)构建自定义可重定位文件,该文件用于具有紧密内存限制的平台(PPC)。这很好用,但它包含约1兆字节的初始化代码,我们想要在启动后卸载它。因此,我们将所有的初始化代码放在自定义节中以便卸载它,但不幸的是,该工具无法正确处理自定义节,因此rel文件无效。所以我的任务是开发一个新工具,正确生成包含自定义节的可重定位文件。
我已经在开发这个工具方面做得相当好,并生成了rel文件,但目前正陷入困境,试图弄清楚如何处理部分数据并构建重定位条目等。作为一名高级程序员,这项任务使我感到非常不适应,所以这些反向工程的业务对我来说都是新的领域(谢天谢地有互联网!)。
我找到了Elf Sharp,并以此作为起点。它允许我加载ELF和PLF文件,并与它们的内容交互。从那里开始,我逆向工程了重定位文件的头和内容,但仍远未准确。当我将旧工具版本的文件与我的文件进行比较时,我发现一些部分数据已被修复,而我的文件使用直接从PLF文件中复制的部分数据并且是空的。我的意思是我复制过来的节数据包含大量的“48 00 00 01”,但这些在旧工具中都被修复了。这些字节的意义是什么,以及正在做什么?我还必须生成重定位条目,但不确定如何继续。
我在网上找到了一些处理elf重定位的示例,并且我在我的工具中有类似的东西正在运行,但我仍然对我应该做什么不太清楚。我有关于所有重定位类型及其公式的良好资源(第4.12.5章此处),但我仍然不确定该使用哪些偏移量、部分信息等。
您能帮我想象一下这些重定位条目到底发生了什么,它是如何生成和处理的,以及在程序执行时如何使用吗?
对于部分数据中的所有“48 00 00 01”单词已经做了什么?我假设它们已经使用适当的符号解析,但是这是如何完成的?使用.rela信息吗?
此外,我不确定何时应该使用PLF内容,何时应该使用ELF内容。我认为我只需要ELF来获取加载地址和段信息。
当我生成重定位修复(在PPC上)时,我应该如何评估重定位类型方程式?我在线上参考的示例在这一点上并不直观。我对偏移量感到困惑-您可以从Elf32_Rela中获得一个偏移量,但这是您修改的那个吗?用于记录修复结果的偏移量是什么?到底什么是加数?我没有找到任何有启示性的在线资料。
一些(实际上大多数)重定位修复指向若干个.debug_*部分或.bss。我应该跳过.debug修复还是这些很重要?.bss是一个NoBits部分,那我该如何处理?当涉及到实际生成重定位条目时,我了解它们是如何构造的,但是背后是谁/什么在制作这些条目呢?我的意思是,我准备构建它,但是我不知道从哪里开始-我需要遍历某些数据还是什么?
是否还有其他问题我应该问但尚未意识到?;)
感谢您阅读我冗长的问题!