即使符号存在于 .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

即使使用 -g 标志编译,gdb 中也没有调试符号

尽管存在符号链接,ld 仍无法加载库

加载 xdebug.so 未定义符号失败:zend_empty_string

PHP警告:无法加载动态库'/usr/lib64/php/modules/solr.so'未定义符号:php_json_decode_ex in Unknown on line 0

Linux 上的 MATLAB MEX 文件无法在 libpython.2.7.so 中找到符号