在Visual Studio中,我想僅通過序號從dll導出函數。在源我定義函數爲:從dll通過序號導出函數只隱藏函數名稱
int my_function() { return 101; } // without declspec(dllexport)
在DEF文件:
LIBRARY MyDll
EXPORTS
my_function @ 1 NONAME // NONAME, export directory will not contain function name
在主程序中我用這樣的:
#pragma comment(lib, "MyDll.lib")
declspec(dllimport) int my_function();
int main(int argc, char* argv[])
{
int a = my_function();
return 0;
}
代碼編譯和鏈接細。 NONAME
屬性被記錄爲只有序號的導出功能。
導出目錄的MyDll有NumberOfNames
設置爲零,所以dll本身不包含名稱信息。 exe文件通過序號值導入函數,所以EXE也不包含名稱信息。
我試過不同的配置(調試,發佈),仍然程序鏈接正常。也許lib文件包含函數名和序號之間的某種映射?我讀了LIB文件包含函數的thunk,所以我們可以有這樣的事情裏面庫文件:
my_function @ 1:
jmp IAT[0]
my_another_function @ 2:
jmp IAT[1]
而且在文件的exe導入表:
OriginalFirstThunk FirstThunk
0x80000001 (@ 1) 0x80000001 (@ 1) // ordinal 1 will go through IAT[0]
0x80000002 (@ 2) 0x80000002 (@ 2) // ordinal 2 will go through IAT[1]
和內存中的exe導入表:
OriginalFirstThunk FirstThunk
0x80000001 (@ 1) IAT[0]
0x80000002 (@ 2) IAT[1]
如果是這樣那麼爲了隱藏函數名,我們應該只提供dll文件,這意味着用戶將需要與LoadLibrary
加載DLL並使用GetProcessAddress
?我在這裏錯過了什麼?
如果代碼編譯並鏈接正常,那麼你的問題到底是什麼? – selbie
@selbie:我想知道爲什麼它鏈接好,但它不應該。 – igntec
「我讀的lib文件包含函數thunk」 - 這是不正確的。 – RbMm