2016-01-13 33 views
1

我有點奇怪的問題。如果我使用objdump的-d拆卸的ARM二進制它可以解決功能(系統庫)的分支指令例如爲:gdb與objdump arm拆裝器功能分支名稱解析

8404: e581e000 str lr, [r1] 
8408: e59f0028 ldr r0, [pc, #40] ; 8438 <address_of_message1> 
840c: ebffffc1 bl 8318 <[email protected]> 
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 <[email protected]> 
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的名稱嗎?

回答

1

gdb和GNU objdump使用相同的庫(bfd)來讀取和解釋庫,但它的靜態編譯爲。 這意味着舊版本的gdb可能會顯示更少的新objdump。

我已經測試了最近的objdump和i386上最近的gdb在hello world上都顯示了相同的信息。

請檢查您使用的是最近的gdb。

注意:printf @ plt函數不是printf本身,而是一個指向動態加載器的函數,它將在發生跳轉時從共享庫加載真實printf