问题1:
导出符号里面有 @0,@4等等,如:
DllCanUnloadNow@0
DllRegisterServer@0
DllUnregisterServe@0
DllGetClassObject@12
解决方法:
需要链接时加上 -Wl,--kill-at 参数
问题2:
导出了很多没有用的符号,如:
_ZN13CClassFactory10LockServerEi@8
_ZN13CClassFactory14CreateInstanceEP8IUnknownRK5_GUIDPPv@16
_ZN13CClassFactory14CreateInstanceERK5_GUIDPK17CLASS_OBJECT_INITjS2_PPv
_ZN13CClassFactory14QueryInterfaceERK5_GUIDPPv@12
_ZN13CClassFactory6AddRefEv@4
_ZN13CClassFactory7ReleaseEv@4
_ZN13CClassFactoryC1EPFlRK5_GUIDPPvE
_ZN13CClassFactoryD1Ev
_ZN13IClassFactoryC2Ev
_ZN8IUnknownC2Ev
_ZN8IUnknownC2Ev
解决方法:
需要写一个 version-script 文件,链接时加上参数 -Wl,--version-script=<文件名>
文件内容如下:
{
global:
DllCanUnloadNow*;
DllRegisterServer*;
DllUnregisterServer*;
DllGetClassObject*;
local: *;
};
注意函数名称后面的“*”是必须的,否则不导出任何符号。
原因是version-script先起作用,然后kill-at才起作用,在version-script的时候用绝对的名字匹配,匹配不上,必须用通配符匹配。