2017-08-03 81 views
1

有沒有辦法在objdump中獲得完整的地址? 正在使用的命令是:objdump -d prognameObjdump沒有顯示完整的地址

enter image description here

的前導零不正確的。該地址應該如下:

enter image description here

最後三個在地址值是正確的;但是,我非常希望在objdump中顯示完整的地址。

+0

這些地址是從*零*開始的嗎? –

+0

不,當我在edb中運行時,地址顯示爲第二個圖像。 –

+0

我想我的第一個問題是,你正在尋找一個物理或虛擬地址?其次,假設這是一個用戶空間應用程序,我不認爲'objdump'知道內核將在運行時放置應用程序的位置,甚至不太可能知道物理地址。 –

回答

2

在您的應用程序加載之前,您無法確定它將在內存中結束的位置。

試試下面的代碼:

#include <stdio.h> 
int main() 
{ 
    printf("%p\n", main); 
} 

gcc test.c編譯並運行了好幾次。

我的研究結果表明:

0x55f71f8936b0 
0x5630ed7ff6b0 
0x558a18eea6b0 
... 

所以你不能確切地知道它將會在內存結束。我認爲情況並非總是如此,而這種行爲的目的是作爲安全「事情」。如果舊的內核/加載程序在每次運行時給出相同的地址,我不會感到驚訝。不過,我當然不知道。

當然objdump會給你的相對地址:

00000000000006b0 <main>: 

請記住,這個程序的輸出不會給你的物理地址,它們仍然是虛擬的。

的要點是,通過objdump傾倒地址是從每個執行的接頭和實際的虛擬地址的責任是有,因爲裝載機的。

+0

好的,這使得很多。我正在研究一個較老的內核,並且最近做了一個更新的內核。只是沒有意識到有這個漂亮的安全功能。我蹲了一會兒,然後問道。猜猜我正在尋找錯誤的東西。無論如何,感謝您的信息。 –

+0

請記住,無論您使用哪種加載程序,符號的最終地址都不會提供給objdump。使用較舊的加載器時,這個運行時地址在每次運行時可能都是相同的,但這是唯一的區別,我想。 –