【问题标题】:Visual Studio export symbol from Exe从 Exe 导出 Visual Studio 符号
【发布时间】:2011-06-21 18:55:46
【问题描述】:

我正在尝试从可执行文件中导出符号 - exe 的主程序是交互式 shell,而导出的符号为外部程序提供功能。

这是我当前的导出宏:

#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)”来自哪里,我该如何摆脱它? VS-C++-project 使用“空项目”模板,未修改……

【问题讨论】:

    标签: visual-studio visual-c++ export exe symbols


    【解决方案1】:

    Dumpbin 使用 .pdb 文件来提供更多信息。它包含调试信息,Visual Studio 项目默认生成一个。您最初的手动编译版本没有创建 .pdb。删除 .pdb 以获得相同的输出。

    【讨论】:

    • 谢谢,成功了 - 如果我动态加载 EXE 并使用 GetProcAddress(这与 DLL 不同),有什么需要考虑的吗?
    • 是的,它不起作用。也许你可以创建一个可重新定位的EXE,我不知道。这是一个不同的问题,开始另一个问题。
    猜你喜欢
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 2017-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-10
    相关资源
    最近更新 更多