我正在寻找一种方法来为使用GCC编译的DLL中的导出函数定义一个未编码的别名。
根据this StackOverflow answer,Visual Studio支持
#pragma comment(linker, "/EXPORT:SomeFunction=_SomeFunction@@@23mangledstuff#@@@@")
指定导出的函数应具有给定的别名。我在海湾合作委员会寻找类似的东西。 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是否不支持导出函数的未拼写别名?
答案 0 :(得分:2)
您是否尝试过.def文件:
normalName=mangled_name @ 1
另一种方法可能是定义一个调用内部C ++函数的extern“C”函数,并将其导出。