DLPon工作,但DLSim不工作

dlopen works but dlsym doesn't

本文关键字:工作 DLSim DLPon      更新时间:2023-10-16

我正在使用以下代码段加载Linux上的so库:

handle = dlopen("myLib.so", RTLD_LAZY);
if(handle == NULL) {
  throw std::runtime_error("unable to load myLib.so");
}

再往下,我尝试访问so中的方法:

getter = dlsym(handle, "getMethod");
if(getter == 0) {
  std::ostringstream msg;
  msg << "missing entry point " << dlerror();
  throw std::runtime_error(msg.str().c_str());
}

运行这个时,在dlopen阶段没有异常,但我一直得到错误:

missing entry point undefined symbol: getMethod

myLib.so上运行nm显示getMethod:

> nm myLib.so | grep get
0000000000024220 T getMethod

我想,我也在那个方法上使用extern "C"

我现在怀疑,虽然句柄的NULL检查不会引起异常,但句柄本身可能有问题。

除了== NULL之外,我是否可以对句柄执行任何进一步的检查,以确认调用dlopen是否成功?

一种可能是存在一些失败的依赖,而RTLD_LAZY正在屏蔽它。尝试使用RTLD_NOW来代替,看看是否仍然可以dlopen()共享对象