【问题标题】:gdb vs. objdump arm disassembler function branch name resolvinggdb vs. objdump arm 反汇编函数分支名称解析
【发布时间】:2016-01-13 08:31:41
【问题描述】:

我有一个奇怪的问题。如果我使用 objdump -d 反汇编 ARM 二进制文件,它可以解析分支指令的函数(系统库)名称,例如:

8404:   e581e000    str lr, [r1]
8408:   e59f0028    ldr r0, [pc, #40]   ; 8438 <address_of_message1>
840c:   ebffffc1    bl  8318 <printf@plt>
8410:   e59f0028    ldr r0, [pc, #40]   ; 8440 <address_of_scan_pattern>
8414:   e59f1028    ldr r1, [pc, #40]   ; 8444 <address_of_read>
8418:   ebffffc4    bl  8330 <scanf@plt>
841c:   e59f0018    ldr r0, [pc, #24]   ; 843c <address_of_message2>

所以我看到 bl 8318 会调用 printf。 当我使用 gdb 和 disas 命令时,我得到了没有函数名的反汇编(相同的代码示例),请参阅:

   0x00008408 <+8>:     ldr r0, [pc, #40]   ; 0x8438 <address_of_message1>
   0x0000840c <+12>:    bl  0x8318
   0x00008410 <+16>:    ldr r0, [pc, #40]   ; 0x8440 <address_of_scan_pattern>
   0x00008414 <+20>:    ldr r1, [pc, #40]   ; 0x8444 <address_of_read>
   0x00008418 <+24>:    bl  0x8330

在 gdb 中,我只看到 0x8330 的分支。

是否也可以使用 gdb 解析函数名称?

谁能解释一下为什么 objdump 可以解析系统函数调用的名称而 gdb 不能?

【问题讨论】:

    标签: gdb arm disassembly objdump


    【解决方案1】:

    gdb 和 GNU objdump 使用相同的库 (bfd) 来读取和解释库,但它是静态编译的。 这意味着,旧版本的 gdb 显示的内容可能少于新版本的 objdump。

    我在 hello world 上的 i386 上测试了一个最近的 objdump 和一个最近的 gdb,它们都显示了相同的信息。

    请检查您使用的是最新的 gdb。

    注意:函数printf@plt不是printf本身,而是一个指向动态加载器的函数,当跳转发生时,它会从共享库中加载真正的printf

    【讨论】:

      猜你喜欢
      • 2014-03-15
      • 2011-04-21
      • 1970-01-01
      • 2014-05-11
      • 1970-01-01
      • 2011-02-18
      • 2020-07-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多