2016-03-31 20 views
1

後長地址我寫在NASM(Linux)的一個簡單的小程序:objdump的表示鏈接

nasm program

使用命令nasm -f elf32 -o file.o file.asm以生成目標文件。

當使用objdump -M intel -d file.o我得到這樣的結果:

objdump

我看到,objdump顯示的地址是合理的,但是當我做了編譯,生成與該命令ld -m elf_i386 -o executable file.o可執行代碼;我得到通過使用objdump的上的可執行文件followwing結果:

enter image description here

問題:

  1. 爲什麼地址成了這漫長的,雖然,可執行文件非常小(500個字節最)。
  2. 關於地址指向什麼,我相信它沒有指向內存,因爲程序還沒有收費。
  3. 他們是相對還是絕對地址?如果相對,那麼相對於什麼?如果是絕對的,它們怎麼可能是絕對的,程序還沒有在內存中被收費。

如果這個問題對於你們中的一些人來說似乎很愚蠢,我真的很抱歉,但是我真的需要明白這一點,這對我的項目會有很大的幫助。

回答

0

爲什麼地址變得這麼長,儘管可執行文件非常小(最多500字節)。

因爲i386 Linux的默認加載地址是0x8048000。該地址與您的程序的大小無關。您可以將其更改爲其他地址,例如-Ttext-segment=0x...000鏈接器標誌。

在哪些呢地址指向,我相信它不會在存儲

它指向地址在內核控制傳送給它之前加載您的可執行點。這也被稱爲「鏈接到」地址。您可以查看readelf -l a.out以查看您的二進制文件中存在哪些PT_LOAD段,以及它們將在內存中的哪些位置加載。

他們是相對或絕對地址

絕對。

+0

我以爲Linux使用相對地址!如果我對這兩個具有這些地址的節目收費,他們會在哪裏? – Sidahmed