【问题标题】:How to get address of printf function in arm executable如何在arm可执行文件中获取printf函数的地址
【发布时间】:2013-05-24 19:47:56
【问题描述】:

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

【问题讨论】:

  • 是的,我尝试过类似的方法,但我无法重新定位到新代码,我忘记添加重定位类型是 #define R_ARM_CALL 28(其中 28 是实际文件中的值)

标签: c++ assembly arm elf relocation


【解决方案1】:

由于无法了解您的进度在哪里,最好的建议是指出一些源代码。在bionic git 下查看Android 的linker

【讨论】:

    【解决方案2】:

    如果你懂 C++,请使用源 Luke。

    参见:Assemblers and Loader,作者 David Solomon。 [一些智慧的珍珠,一些古老的琐事]

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

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

    【讨论】:

    • 按照我的建议,我加快了 vxWorks 加载程序的速度。
    • 是的,它在同一个文件中运行,但在我尝试加载的文件中,存在未解析的 printf。
    • @user1338333 那么这是一个不同的问题。您需要按照auselen 的建议显示一些需要修复的 elf 条目和汇编程序。
    【解决方案3】:

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

    编辑:

    类似这样的:

    bl printf 应该像 bl offset_to_patch_code 一样解析

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

    【讨论】:

      猜你喜欢
      • 2017-04-05
      • 2014-12-29
      • 2016-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-06
      • 1970-01-01
      • 2011-11-14
      相关资源
      最近更新 更多