gdb与objdump arm反汇编程序功能分支名称解析

gdb与objdump arm反汇编程序功能分支名称解析,gdb,arm,disassembly,objdump,Gdb,Arm,Disassembly,Objdump,我有一个奇怪的问题。如果我使用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, #

我有一个奇怪的问题。如果我使用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>
8404:e581e000 str lr[r1]
8408:e59f0028 ldr r0,[pc,#40];8438
840c:ebffffc1 bl 8318
8410:e59f0028 ldr r0,[pc,#40];8440
8414:e59f1028 ldr r1,[pc,#40];8444
8418:ebffffc4 bl 8330
841c:e59f0018 ldr r0,[pc,#24];843c
所以我知道bl 8318将调用printf。 当我使用gdb和disas命令时,我得到的反汇编没有函数名(相同的代码示例),请参阅:

0x00008408:ldr r0,[pc,#40];0x8438
0x0000840c:bl 0x8318
0x00008410:ldr r0,[pc,#40];0x8440
0x00008414:ldr r1,[pc,#40];0x8444
0x00008418:bl 0x8330
在gdb中,我只看到指向0x8330的分支

也可以用gdb解析函数名吗


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

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

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

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

注:功能printf@plt不是printf本身,而是一个指向动态加载程序的函数,它将在发生跳转时从共享库加载真正的printf

   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