[英]Weird function calling convention
我正在調試windbg中的x86 DLL,特別是一個應該具有以下簽名的函數:
bool __cdecl func(LPVOID p1, LPVOID p2, wchar_t* p3, size_t p4, LPVOID p5)
該功能未導出。 AFAIK __cdecl
應該接收堆棧上的所有參數, 調用者應該清除堆棧。
但事情並非如此。 Windbg說調用約定是__cdecl
但前兩個參數是在ecx
和edx
上傳遞的,就像__fastcall
函數一樣。 函數本身也在清除堆棧,我認為不應該由__cdecl
函數完成。
我試圖掛鈎該功能但沒有成功。 我試圖將繞行函數設為__cdecl
和__fastcall
,兩者都會導致崩潰。
有什么建議?
如果函數在可執行文件(不是庫)中或僅在同一DLL中調用,則編譯器可以根據需要優化調用約定。
如果編譯器知道兩端(調用者和被調用者),並且知道該函數不會被導出到另一個單元(就像它與庫一樣),那么它可以以任何方式進行優化。
那么:函數是完成的可執行文件的一部分嗎? 你有優化嗎?
我建議關閉優化,然后重試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.