【发布时间】:2014-03-22 19:46:58
【问题描述】:
我正在寻找一种方法来为使用 GCC 编译的 DLL 中的导出函数定义未损坏的别名。
根据this StackOverflow answer,Visual Studio 支持
#pragma comment(linker, "/EXPORT:SomeFunction=_SomeFunction@@@23mangledstuff#@@@@")
指定导出的函数应具有给定的别名。我在 GCC 中寻找类似的东西。 The GCC function attribute docs 建议 __attribute__ ((alias ("target"))) 可以解决问题,但这只会生成一个损坏的函数名称:
#undef DLL_EXPORT
#ifdef CCDLL_EXPORTS
#define DLL_EXPORT __stdcall __declspec(dllexport)
#else
#define DLL_EXPORT __stdcall __declspec(dllimport)
#endif
DLL_EXPORT CCDLL_v1* GetCCDLL_premangled();
DLL_EXPORT CCDLL_v1* GetCCDLL () __attribute__ ((alias ("_Z19GetCCDLL_premangledv")));
这是生成的 DLL 中的 .def 文件:
EXPORTS
_Z19GetCCDLL_premangledv @1
_Z8GetCCDLLv @2
原始函数按预期导出和修改,但函数别名也是如此。如果我从函数别名中删除DLL_EXPORT,我希望它不会损坏,但它也不会从 DLL 中导出。我认为 stdcall 调用约定可能会破坏函数别名,但是当我从 DLL_EXPORT 定义中删除它时,.def 文件仍然完全相同。
This SO answer 建议我可以使用--defsym=alias_name=target 定义一个别名,但 ld 似乎无法识别这一点,我在 official GCC linker docs 中根本找不到任何东西。
有没有办法做我正在寻找的,或者 GCC 只是不支持导出函数的未损坏别名?
【问题讨论】: