2012-11-01 82 views
0

基本上,我用objdump -D來卸載目標文件和ELF文件。我認爲兩者之間的主要區別在於。反彙編對象和可執行文件的差異

我看到目標文件(單個段)中的指令的地址以開頭。因此,連續地址是,將偏移一定的值,可能取決於對應於該特定指令的操作碼的長度。

Disassembly of section .text: 
00000000 <main>: 
0: 8d 4c 24 04    lea 0x4(%esp),%ecx 
4: 83 e4 f0    and $0xfffffff0,%esp 
7: ff 71 fc    pushl -0x4(%ecx)  
a: 55      push %ebp    

在另一方面,對於ELF罰款我看到了一個instructions.Also 32 位地址空間如果我在我的程序打印main地址。這相當於我拆散ELF中的地址。

08048394 <main>: 
8048394:  8d 4c 24 04    lea 0x4(%esp),%ecx 
8048398:  83 e4 f0    and $0xfffffff0,%esp 
804839b:  ff 71 fc    pushl -0x4(%ecx) 
804839e:  55      push %ebp 

這裏的問題是。

  • ELF文件中的地址實際上指的是什麼?
  • 鏈接器如何計算它們?

回答

2

ELF文件包含與可執行文件的首選加載地址鏈接在一起的代碼(您可以通過鏈接器選項更改首選項)。你看到的地址是由objdump根據該地址計算的,該地址是ELF格式的一部分。

對象代碼沒有加載地址(尚未),因爲它沒有鏈接到可加載的圖像。一旦它與鏈接器一起縫合(以及對象代碼和共享對象引用的其餘部分),最終的輸出將所有代碼移動到與首選加載地址相對的位置(有點......加載器實際上是當ELF圖像被加載執行)。 Suggested further reading(並有鏈接TON)

相關問題