2013-02-20 40 views
0

考慮只用簡單的32位x86彙編語句文件:在nasm中指定起始地址?

call 0xc1066580 

如果我組裝與此文件NASM -f小精靈,我得到:

0: e8 7c 65 06 c1   call 0xc1066581 

如果我使用GCC,並指定 - Ttext = 0和-nostdlib我得到:

0: e8 7b 65 06 c1   call c1066580 

-nostdlib 不要使用標準系統啓動文件或鏈接時庫。沒有啓動文件,只有指定的庫傳遞給鏈接器,並且忽略指定系統庫鏈接的選項,如-static-libgcc或-shared-libgcc。

但是-Ttext = 0究竟做了什麼?我用它來指定EIP在加載/執行時啓動的入口地址。我找不到-Ttext in the manpages,當我在網上搜索時,我發現這個:

「-Ttext是」--section-start = text「的別名,其內容如下: --section- start = sectionname = org 在輸出文件中找到一個由org指定的絕對地址爲 的部分。您可以根據需要多次使用此選項,以便在命令行中找到多個部分。 ;爲了與其他鏈接器兼容,你可以省略通常與十六進制值相關的前導0x。 注意:段名, 等號(「=」)和org之間不應有空格。

http://www.linuxquestions.org/questions/linux-general-1/gcc-creating-a-huge-executable-image-redhat-2-6-18-8-el5-x86_64-linux-759302/

不過,我不覺得我的聯機幫助--section或sectionname或者,當我嘗試--section名稱,以取代-Ttext我得到的,這是無法識別的參數(如果是相關的,這是GCC 4.7.2)。

有人能告訴我,這個解釋(-Ttext)是否準確,我可以在我的手冊中找到它?如果不準確,-Ttext究竟做了什麼?

我的另一個問題是:如何指定一個類似的參數作爲-Ttext到nasm?換句話說,我需要做些什麼才能使nasm產生與gcc相同的輸出?

我試圖在64位和32位系統上執行相同的彙編語句(使用nasm和gcc),我得到了相同的結果。

回答

0

運行ld --help

-Ttext ADDRESS    Set address of .text section 


如果我們使用組裝gcc -Ttext=8 -nostdlib -o test test.s

.globl _start 
_start: 
movl test,%ebx 
test: 

下面的程序並轉儲節頭(objdump -h test):

Sections: 
Idx Name   Size  VMA    LMA    File off Algn 
    0 .text   00000007 0000000000000008 0000000000000008 00200008 2**2 
        CONTENTS, ALLOC, LOAD, READONLY, CODE 

..與代碼(objdump -d test):

0000000000000008 <_start>: 
    8: 8b 1c 25 0f 00 00 00 mov 0xf,%ebx 

我們可以看到,.text部分有8起始地址和大小的7也就是說,節內的符號的所有參考的起始地址已經被抵消我們指定了(8),但是沒有填充(部分大小沒有因爲改變其地址而增長)。

您應該能夠通過使用來實現與NASM一樣的東西ORG directive「的指令說NASM的ORG不正是:起源它的唯一作用是指定一個偏移量添加到所有內部地址的引用中部分「