即使符号存在于 .so 文件中也无法加载符号? [复制]
Posted
技术标签:
【中文标题】即使符号存在于 .so 文件中也无法加载符号? [复制]【英文标题】:Unable to load symbol even if it is present in .so file? [duplicate] 【发布时间】:2014-09-22 07:08:42 【问题描述】:现在,我已经尝试加载动态库一个小时,卡在无法加载符号,让我告诉你我的问题。 这是我的代码的sn-p,
void *hInstLib = dlopen("libnbuVmwareTools.so",RTLD_NOW);
LoadOneFunc(hInstLib,(void **)&vmcGetDiskChangedInfoStrm_Ptr,"vmcGetDiskChangedInfoStrm");
void LoadOneFunc(void* dlHandle, void** pFunction, const char* funcName)
std::stringstream strStream;
*pFunction = dlsym(dlHandle, funcName);
char* dlErrStr = dlerror();
if (*pFunction == NULL || dlErrStr != NULL)
strStream << "Failed to load " << funcName << ". Error = " << dlErrStr << "\n";
throw std::runtime_error(strStream.str().c_str());
现在,我检查了 libnbuVmwareTools.so 中是否存在 vmcGetDiskChangedInfoStrm,
并且lib加载成功,但是,
[root@vm vmcbt]# g++ dltest.cpp -L/root/vmware/usr/openv/lib -lnbuVmwareTools
[root@vm vmcbt]# ./a.out
Successfully loaded Library
Error while dynamically loading : Failed to load vmcGetDiskChangedInfoStrm. Error = /root/vmware/usr/openv/lib/libnbuVmwareTools.so: undefined symbol: vmcGetDiskChangedInfoStrm
当使用 nm -C 命令检查 .so 文件中是否存在符号时,
[root@vm vmcbt]# cd
[root@vm ~]# cd /root/vmware/usr/openv/lib/
[root@vm lib]# nm -C libnbuVmwareTools.so | grep vmcGetDiskChangedInfoStrm.
00000000006680bc T vmcGetDiskChangedInfoStrm(void*, int, long, char const*, char const*, char const*, char const*, std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >&, bool)
我没有遇到这个问题,对此的任何帮助将不胜感激。
【问题讨论】:
由于LoadOneFunc
实际加载,有什么特别的理由选择不发布它吗?
您可以尝试在链接选项中添加--export-dynamic
或-rdynamic
吗?
我已经更新了问题描述,添加了 LoadOneFunct 定义。
【参考方案1】:
该函数被定义为 C++ 函数(我可以看到,因为它在清单中具有参数类型)。所以你需要弄清楚它的名字是什么,可能是_Z25vmcGetDiskChangedInfoStrmPvilPKcS1_S1_S1_RSt18basic_stringstreamIcSt11char_traitsIcESaIcEEb
,然后寻找它。
【讨论】:
不带 -C 参数运行nm
,你会找到正确的名称(虽然很难确定函数是否重载)
或者如果可能的话,在你的函数签名中避开 C++ 类型,而使用 C 类型和extern "C"
它
@Steve: 很难传入stringstream
类型然后...
你是对的,我能够找到在.so文件中定义的函数名,只使用nm“没有-C”。但是有很多这些功能,我需要从这个链接器库中加载。有没有其他方法可以使用较早的函数名称,因为我正在使用提供给我的头文件。?
我的猜测是您不应该手动加载它们,而是与共享库链接...以上是关于即使符号存在于 .so 文件中也无法加载符号? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
无法加载库“/usr/lib/pgsql/plpgsql.so”和未定义符号:PinPortal
加载 xdebug.so 未定义符号失败:zend_empty_string
PHP警告:无法加载动态库'/usr/lib64/php/modules/solr.so'未定义符号:php_json_decode_ex in Unknown on line 0