2013-11-22 26 views
0

我正在查看一些來自英特爾編譯器的Linux代碼。它看起來像函數正在爲兩個調用約定一次編譯。映射文件中有許多函數名稱對,如下所示:編譯多個調用約定

0x0000000008000000 __foo 
0x0000000008000008 __foo. 

函數對之間的偏移量是4,8或12個字節。每個那些對應於1,2或3 MOV指令正在移動棧參數傳遞給寄存器這樣的:

__foo: 
mov  eax, [esp+4] 
mov  edx, [esp+8] 
__foo.: 
push ebp 
... 

這些指令之後,它看起來像使用regparm慣例開始的功能。

英特爾編譯器是否使用兩種不同的調用約定生成函數,然後使用給定調用方的哪個入口地址是正確的?

+0

你使用什麼選項來編譯代碼? –

+0

我不知道。客戶提供此代碼。我試圖弄清楚如何告訴他們改變他們的構建設置,而不知道他們是什麼。 – mike663

回答

0

其實,我說你已經回答了自己的問題:

是否英特爾編譯器生成兩種不同的調用 約定的功能,然後用取入口地址是正確的 定呼叫者?

foo函數似乎是用__regcall屬性聲明的。我的教育猜測是,您必須使用Debug配置文件編譯程序,因爲基於堆棧幀的調用約定允許更輕鬆地獲得一些信息。