2011-06-21 24 views
0

我想從可執行文件導出符號 - exe的主要是一個交互式shell,而導出的符號提供外部程序的功能。從埃克塞特Visual Studio導出符號

這是我目前出口的宏:

#define LIB_EXP extern "C" __declspec(dllexport) void __cdecl 

導出功能:

LIB_EXP Register() { /**/ } 

如果我使用cl.exe時直接 - 不帶任何開關 - 我得到以下符號表,看來這好的:

00000000 characteristics 
4E00E611 time date stamp Tue Jun 21 20:42:25 2011 
    0.00 version 
     1 ordinal base 
     1 number of functions 
     1 number of names 

ordinal hint RVA  name 

     1 0 00001000 Register 

Summary 

    4000 .data 
    5000 .rdata 
    2000 .reloc 
    11000 .text 

用VS 2010編譯得到以下符號表:

00000000 characteristics 
4E00E369 time date stamp Tue Jun 21 20:31:05 2011 
    0.00 version 
     1 ordinal base 
     1 number of functions 
     1 number of names 

ordinal hint RVA  name 

     1 0 00011005 Register = @ILT+0(_Register) 

Summary 

    1000 .data 
    1000 .idata 
    3000 .rdata 
    1000 .reloc 
    1000 .rsrc 
    6000 .text 
    10000 .textbss 

作爲該導入此exe程序被使用後期綁定,並查找通過導出的函數「GetProcAddress的」我依賴於功能是完全相同作爲指定的名稱。 有沒有人知道這個混亂「= @ ILT + 0(_Register)」有點看起來像名稱mangling從哪裏來,以及如何我可以擺脫它? VS-C++ - 項目使用「空項目」模板,且未修改...

回答

1

Dumpbin使用.pdb文件提供更多信息。它包含調試信息,Visual Studio項目默認生成一個。您的原始手動編譯版本不會創建.pdb。刪除.pdb以獲得相同的輸出。

+0

謝謝,那就是訣竅 - 如果我動態加載EXE並使用GetProcAddress(與DLL不同),有什麼需要考慮的嗎? – MFH

+0

是的,它不起作用。也許你可以創建一個可重定位的EXE,我不知道。這是一個不同的問題,開始另一個問題。 –