即使符号存在于.so文件中,也无法加载该符号

Unable to load symbol even if it is present in .so file?

本文关键字:符号 加载 文件 存在 so      更新时间:2023-10-16

现在,我已经尝试加载动态库一个小时了,一直处于无法加载符号的状态,让我向您展示我的问题。这是我的代码片段,

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());
    }
}

现在,我已经检查了vmcGetDiskChangedInfoStrm是否存在于libnbuVmwareTools.so中,

并且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)

我不明白这个问题,如果能在这方面提供任何帮助,我将不胜感激。

函数被定义为C++函数(我可以看到这一点,因为它在列表中有参数类型)。所以你需要弄清楚这个名字是什么,可能是_Z25vmcGetDiskChangedInfoStrmPvilPKcS1_S1_S1_RSt18basic_stringstreamIcSt11char_traitsIcESaIcEEb,然后寻找它。