2012-06-28 62 views
2

我正在爲32位和64位Linux操作系統創建驅動程序。其中一個要求是,所有的代碼都需要自我包含,而且沒有呼叫。在64位我沒有問題,但在32位GCC似乎增加了一個調用指令到下一個字節。搜索了一下後,我發現這個鏈接:Linux 32位反彙編調用指令到下一個字節

http://forum.soft32.com/linux/Strange-problem-disassembling-shared-lib-ftopict439936.html

有沒有一種方法來禁用此32位Linux?

實施例: 32位拆解:

<testfunc>: 
0: push %ebp 
1: mov %esp, %ebp 
3: call 4 <test_func+0x4> 
<...some operation on ebx as mentioned in the link above> 

64位disassebmly:

<testfunc>: 
    0: push %rbp 
    1: mov %rsp, %rbp 
    3: <...no call here> 

有一個在 「testfunc」 沒有呼叫在所有。即便如此,爲什麼32位編譯器添加這些「調用」指令?任何幫助表示讚賞。

+1

您不需要禁用任何東西,這些調用用於計算i386上的PIC基址/ GOT地址,它們*爲*「自含式」,因爲它們不涉及任何外部功能。 –

+0

通過「自給自足」你的意思是通話不做任何事情?如果我單步執行代碼,則會看到該調用實際上跳轉到EIP之外的偏移位置,然後執行某些指令。然後它返回到我的功能。我不想要這種行爲,我試圖禁用這個對GOT的引用。任何投入,如果有可能做到這一點? – asmprogrammer

回答

4

你在32位反彙編中看到的東西可能是使代碼與位置無關的一種方法。請記住call壓入堆棧的返回地址,這等於eip +常量?在64位模式下,有rip相對尋址。在32位沒有。所以這個調用可能會模擬指令指針相對尋址。

+1

如果這是真的32位PIC是一個真棒黑客。 –

+0

此外,如果您檢查重定位條目,這些可能是在加載過程中獲取地址修正的地方,所以最終指令最終並不是「調用4」,因爲「4」被實際替換加載庫/二進制文件時,由ld.so指定的目標地址。 – twalberg

+0

感謝您的回覆傢伙。是的,這與PIC有關。當我添加-fPIC來編譯標誌時,這是我得到的。它試圖參考全球抵消表。 ': 0:推的%ebp 1:MOV%ESP,%EB​​P 3:調用4 R_386_PC32 __i686.get_pc_thunk.bx 9:加$ 0X2,%EBX B:R_386_GOTPC _GLOBAL_OFFSET_TABLE_ f:call * 0x0(%ebx) 11:R_386_GOT32 mcount' – asmprogrammer

0

對下一個字節的調用指令來自「gprof」工具的函數分析。通過從編譯中刪除「-pg」選項,我能夠擺脫這些「調用」指令。

因爲它是一個驅動程序,所以從Linux內核配置文件CONFIG_FUNCTION_TRACER中找到它。