0

我有责任为 ARM elf 可重定位文件制作加载器。我设法以某种方式解析了精灵,并设法进行了一些简单的重定位,但是我必须执行以下操作并且遇到了麻烦。我需要从我试图加载的这个 ELF 文件中调用 printf 函数,它必须与试图加载它的程序中的 printf 函数相同。(那是我的主机程序,用 ARM arch 的 c++ 编写)。我怎样才能得到这个 printf 地址,然后我怎样才能在 elf 文件中重新定位符号。(我用谷歌搜索发现这种类型的重定位使用 24 位 PC 相对寻址)谁能帮我提取 printf 的地址?提前谢谢!

4

3 回答 3

1

由于无法了解您的进度在哪里,最好的建议是指出一些源代码。在仿生git下检查 Android 的链接器。

于 2013-04-19T22:22:47.347 回答
0

如果您能理解 C++,请使用源 Luke。

请参阅:David Solomon汇编程序和装载程序。[一些智慧的珍珠,一些古老的琐事]

据我了解,printf它在同一个文件中,您需要在运行时修补地址。在这种情况下,重定位是24 位 PC 相对重定位。答案是在这种情况下你什么都不做。由于可执行文件和实现都在同一个二进制文件中,因此 无论加载地址是什么, 24 位 PC 相关文件都已经重新定位。

如果您要重新定位共享库,则过程会有所不同。

于 2013-04-19T22:29:45.363 回答
0

我找到了解决方案。当我得到 (unsigned int)printf 时,我得到了函数的实际 32 位地址。补丁代码必须添加到 ELF 文件中文本部分的末尾。现在在需要 24 位偏移的地方,将偏移插入到补丁代码中。现在这个补丁代码很难制作。

编辑:

像这样的东西:

bl printf 应该像 bl offset_to_patch_code 一样被解析

补丁代码应该在 .text 部分的底部。计算偏移量管道时要小心,使 pc 点 2 指令提前。补丁代码应该只服务器读入 printf 的 pc 地址。您不需要保存链接寄存器。

于 2013-04-28T09:53:43.490 回答