2010-06-23 43 views
1

生成的導入庫(用於鏈接將加載dll的程序的庫)AFAICS以彙編jmp statings的形式實現對導入函數的各種調用。如何用簡單的jmp程序集實現import lib?

這確實看起來像是一個非常優化的解決方案。它不需要再次推理,也不需要從呼叫中返回。

我想創建自己的導入庫,在其中添加一些其他功能。爲此,我必須調用LoadLibrary()GetProcAddress()函數來獲取dll中函數的地址。但是,我必須提供自己的函數,通過函數地址調用導入的函數。但是這意味着兩次調用,並再次推入堆棧中的參數。我希望這個雙重要求得到優化。

有沒有人知道一種方法來在C實現一個導入庫,會做同樣的jmp詭計? (或者編譯器是否優化了路徑調用?)

+1

我不是很清楚你在這裏問什麼。首先你說導入庫是這樣做的,然後你問如何讓他們這樣做。你能澄清嗎? – torak 2010-06-23 15:46:37

回答

1

聽起來像你可能會對我所謂的「函數轉發」感興趣。它允許你從一個真正在不同DLL中實現的DLL中導出一個函數。

應該差不多是最有效的解決方案

  1. 你不需要給LoadLibrary()/ GetProcAddress的()的調用
  2. 當您從DLL導出導入,加載存儲的地址真正impmplementation在導入表,所以它的一個call和一個jmp

可能實現這個最簡單的方法是用類似

#pragma comment(linker, "/export:ExportedFuncName=ActualDll.ActualFuncName") 

如果您想知道,這實際上與在鏈接器命令行上傳遞「/export:ExportedFuncName=ActualDll.ActualFuncName」相同。也可以使用模塊定義(.DEF)文件的exports部分執行此操作。詳細信息請參見here的底部。

+0

不錯的技術。但轉發不適用:我不想創建一個DLL,我想創建一個靜態庫。 – 2010-06-23 17:10:16

+0

@Didier Trosset:好的,所以還需要別的東西。這是一個32位還是一個64位?它影響了易用性,可以使用匯編代碼。 – torak 2010-06-23 17:22:58