繁体   English   中英

gdb vs. objdump arm反汇编程序函数分支名称解析

[英]gdb vs. objdump arm disassembler function branch name resolving

我有一个奇怪的问题。 如果我使用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为什么可以解析系统functin调用而不能解析gdb的名称吗?

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

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

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

注意:函数printf @ plt本身不是printf,而是指向动态加载器的函数,当发生跳转时,该函数将从共享库中加载实际的printf

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM