2014-06-25 114 views
1

我試圖簡單地將控件從一個函數傳遞給另一個函數。例如,每次調用函數first時,我想用相同的參數調用函數second將函數調用傳遞給另一個不知道參數

問題是:我不知道要傳遞多少個參數,它們的類型或返回類型。爲什麼?我試圖在Windows上使用MingW編寫一個DLL包裝器。所以,在這種情況下,first是庫中的符號,second是我的函數。我知道DLL符號,但不知道它們的原型。

我認爲C編寫second和彙編下面的代碼就足夠了:

_first: 
    jmp _second 

或者是:

_first: 
    call _second 
    ret 

,但它只是給我一個分段故障時first被調用。

+2

gcc有一個非標準的魔術擴展轉發。看看內置函數。 – Deduplicator

+0

謝謝,你能更具體一點嗎?看看內置功能......在哪裏?在GCC來源? –

+1

THey有一個精彩的手冊。 [6.5構造函數調用](http://gcc.gnu.org/onlinedocs/gcc-4.9.0/gcc/Constructing-Calls.html#Constructing-Calls) – Deduplicator

回答

2

得益於@Deduplicator評論,這是最後的工作代碼:

int first() 
{ 
    __builtin_return(
     __builtin_apply(
      (void(*)())second, __builtin_apply_args(), 512)); 
} 

爲什麼512?我不確定。該手冊說

它並不總是很容易計算大小的正確值。該值由__builtin_apply用於計算應該壓入堆棧並從傳入參數區域複製的數據量。

如果任何人有任何想法如何更好地估計大小,讓我知道,我編輯答案。

0

您正在尋找的是一個裸露的函數,即編譯器不會添加模板代碼(以操縱堆棧幀)的函數。不幸的是,似乎沒有直接支持GCC中的裸函數(在MSVC中)。好消息是似乎有一個解決方法,儘管稍微複雜一點,下面列出。

http://gynvael.coldwind.pl/?id=15

別的東西,你可以做的是明確地保存所有寄存器的值。但是,訪問參數變得稍微複雜一些,因爲您必須先查看反彙編,然後相應地更新_second以訪問任何參數。

_first: 
    pushad 
    call _second 
    popad 
    ret 
+0

感謝您的回覆。至於鏈接,我看到他封裝他的assmebly調用C函數:我不能,因爲我不知道我收到的參數。我也測試了你的建議(pushad和popad),但我繼續收到分段錯誤。 –

相關問題