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