dlopen 有效,但 dlsym 无效

Posted

技术标签:

【中文标题】dlopen 有效,但 dlsym 无效【英文标题】:dlopen works but dlsym doesn't 【发布时间】:2014-06-05 18:25:54 【问题描述】:

我正在使用以下 sn-p 在 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 的调用是否成功?

【问题讨论】:

它是否在nm 中显示Tt?如果它显示t,则表示该函数未导出。方法名称中是否有前导下划线?您还应该在问题中显示nm 输出。 添加到原帖(显示T 能否提供一些有关您如何创建 .so 文件的信息? 使用cmake创建的库ADD_LIBRARY, and 'SHARED' 听起来应该很容易为共享对象和主程序提供 SSCCE (sscce.org)。您可以这样做并发布代码(以及您正在使用的构建命令)吗? 【参考方案1】:

一种可能性是存在一些失败的依赖关系,RTLD_LAZY 正在掩盖它。尝试改用RTLD_NOW 看看是否仍然可以dlopen() 共享对象。

【讨论】:

如果是这种情况,您是否认为ldd 也会显示依赖问题? @imrichardcole:我应该这么认为。

以上是关于dlopen 有效,但 dlsym 无效的主要内容,如果未能解决你的问题,请参考以下文章

用dlopen和dlsym得到的符号 在dlclose后还能继续使用么

C:尽管添加了 `-ldl` 标志,但未定义对 `dlopen`/`dlsym` 的引用

加载动态链接库——dlopen dlsym dlclose

插件之dlopen/dlsym/dlclose 加载动态链接库

dlopen / dlsym函数(动态链接库)

dlopen / dlsym函数(动态链接库)