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

时间:2014-09-22 07:08:43

标签: c++ c linux dll

现在,我一直在尝试加载动态库一小时,无法加载符号,让我告诉你我的问题。 这是我的代码片段,

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)

我没有得到这个问题,对此的任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:4)

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