我希望在托管代码中加载非托管C++ DLL,并调用已经被编译的外部函数的 GetProcAddress。我的问题是:C++ 编译器生成的名称是否是确定性的?也就是说,如果原始签名没有更改,那么名称是否总是转换为相同的名称?请注意保留 HTML 标记。
我希望在托管代码中加载非托管C++ DLL,并调用已经被编译的外部函数的 GetProcAddress。我的问题是:C++ 编译器生成的名称是否是确定性的?也就是说,如果原始签名没有更改,那么名称是否总是转换为相同的名称?请注意保留 HTML 标记。
这并没有在标准中具体规定,在我个人的经验中,它在同一编译器的不同版本之间肯定会有所改变,尽管它必须在一些固定的情况下是确定性的,因为否则就无法链接两个单独编译的模块。
如果您正在使用 GetProcAddress
,那么将函数导出为 extern "C"
会更加清晰,这样它们的名称就不会被混淆。
http://www.agner.org/optimize/#manuals
在那个页面上看第5项。
此外,现如今有一些库可以为常见编译器处理名称混淆和还原。对于 Visual C++,起点是使用 dbghelp 和 imagehlp 库。
http://msdn.microsoft.com/en-us/library/ms679292%28v=VS.85%29.aspx
http://msdn.microsoft.com/en-us/library/ms680321%28v=VS.85%29.aspx
名称修饰在每个编译器中处理方式不同(可能有,也可能没有标准)。如果您在C++代码中使用纯C函数,可以使用extern "C"来抑制C函数的名称修饰,以便编译器能够找到它们。