MS lib.exe是否支持DLL符号重定向,如dlltool中的'=='

时间:2013-05-24 05:53:11

标签: c

e.g。如果我有一个导出符号__ugly_name的libtest.dll文件,我想在源文件和lib文件中使用pretty_name,我可以这样做

    D:\var\tmp\build>type t-dll.c

      main() { pretty_name(); }

    D:\var\tmp\build>type libtest.def

      EXPORTS
        pretty_name == __ugly_name

    D:\var\tmp\build>dlltool -k -m i386 --input-def libtest.def  --dllname libtest.dll --output-lib libtest.dll.a

    D:\var\tmp\build>gcc -o t-dll.exe t-dll.c -L. -ltest

    The result t-dll.exe  reference symbol '__ugly_name' in libtest.dll file.
    VERY GOOD !

But for MS lib.exe, 'pretty_name=__ugly_name' does not do the trick:

D:\var\tmp\build>type libtest.def

  EXPORTS
    pretty_name=__ugly_name

D:\var\tmp\build>cl /nologo /MD /Fet-dll-vc.exe t-dll.c libtest.lib

t-dll-vc.exe still reference non-exist symbol 'pretty_name' in libtest.dll file.

可悲。 MS lib.exe是否支持DLL符号重定向? 感谢。

1 个答案:

答案 0 :(得分:0)

看起来你的'丑陋'名称被装饰为stdcall函数,它获得双下划线前缀和@nn后缀,其中nn是函数调用使用的堆栈字节数。您可以通过在.def文件中声明未修饰的名称来重命名这些名称。因此,如果您的代码当前生成__MyApiFunc@4,请创建一个如下所示的.def文件,并使用link.exe -lib选项或使用-link标志后面的编译器将其包含为cl ...c_flags... -link -dll -lib:myapi.def ...linkflags...

LIBRARY yourlibname
EXPORTS
    MyApiFunc

基本上,您不需要等于获取未装饰的名称。您需要对大多数DLL执行此操作,因为通常的Windows约定是具有未修饰名称的stdcall函数。一旦你有这样的DLL,你可以使用if从Visual Basic和.Net就像一个普通的Windows操作系统提供的DLL。 (假设你确实有stdcall函数)。

相关问题