2014-03-12 150 views
2

我有許多關於gdb和objdump的問題。使用gdb和objdump進行調試

地址在objdump的

如果我做的:objdump的-d二進制文件名,然後我得到了包括這部分輸出:

Disassembly of section .text: 

080484a0 <_start>: 
80484a0: 31 ed     xor %ebp,%ebp 
80484a2: 5e      pop %esi 
80484a3: 89 e1     mov %esp,%ecx 

我在承擔這些數字第一列是地址?但我不明白如何知道這些地址,因爲當一個進程被加載時,它被放置在內存中的隨機位置,這意味着代碼每次都有不同的地址?還是這些地址相對於進程的地址空間?

什麼是在< _start>下列出的值?

GDB通過代碼

踩着我,而我沒有源代碼的二進制文件。我想通過該程序,但沒有符號信息。我無法在函數名稱或亞麻布上設置斷點。我試圖在地址上設置一個斷點,這個工作,但我不知道如何一步一步地通過程序。當我這樣做: (gdb)s 或 (gdb)n 它說它沒有線路信息,只是運行整個功能。 有沒有一種方法可以逐步完成它,或者單步執行裝配說明?

回答

3

是的,第一列是地址欄。除非特別標記爲PIE(位置獨立可執行),否則可執行文件將加載到特定地址(每個部分都有自己的地址),在這種情況下,顯示的地址將從0開始,確實只是從隨機加載地址的偏移量。然而,共享庫默認位置是獨立的,可能映射到不同的地址。

第二列是機器代碼本身:程序是指存儲在內存中的字節序列,以及處理器實際查看和執行的內容。

如果您沒有調試信息,則可以使用stepinexti(分別爲短表格sini)。 layout asm如果你不使用某個GUI前端,朋友也可能會有用。