c - erlang nif 共享库上的 undefined symbol

标签 c erlang shared-libraries dlopen undefined-symbol

我在尝试将我的共享库(erlang nif)链接到另一个使用 dlopen 加载其他共享库(插件)的共享库(libpurple)时遇到问题。

问题是 mylib.so 链接到 libpurple.so,libpurple.so 使用 dlopen 加载 plugins.so,而 plugins.so 无法从 libpurple.so 中找到符号

1> mylib:init().
ok
2> /usr/lib/erlang/erts-6.3/bin/beam.smp: symbol lookup error: /usr/lib/purple-2/libmyspace.so: undefined symbol: purple_account_option_string_new

我正在编译:

gcc -fPIC -shared `pkg-config --cflags --libs purple` -I /usr/lib/erlang/erts-6.3/include -o priv/mylib.so c_src/mylib.c

看起来问题出在 erlang:load_nif 上调用的 dlopen,这段代码与 erlang nif 有同样的问题,RTLD_NOW | RTLD_GLOBAL 修复了它,但我无法更改 erlang 调用 dlopen 的方式...

#include <dlfcn.h>
#include <stdio.h>
#include <glib.h>

void (*purple_util_set_user_dir)(const char *dir);
void (*purple_debug_set_enabled)(gboolean enabled);
gboolean (*purple_core_init)(const char *ui);

int main()
{
  void* lib = dlopen("/usr/lib/libpurple.so", RTLD_LAZY);
  purple_util_set_user_dir = dlsym(lib, "purple_util_set_user_dir");
  purple_debug_set_enabled = dlsym(lib, "purple_debug_set_enabled");
  purple_core_init = dlsym(lib, "purple_core_init");

  purple_util_set_user_dir("/tmp/purpletest");
  purple_debug_set_enabled(TRUE);
  purple_core_init("test");

  return 0;
}

我开始工作的唯一解决方法是调用 erlang,如 LD_PRELOAD=/usr/lib/libpurple.so erl 但远非理想。

看起来是同一个问题,使用 RTLD_GLOBAL 解决了,https://developer.pidgin.im/ticket/7872

最佳答案

Erlang VM 不会加载带有公开全局符号的 NIF 库,这是有充分理由的——它会无可挽回地污染全局命名空间。

理论上,我不知道这是否永远正确,插件应该能够动态加载它们的父库以查找其符号,而不会导致操作系统加载另一个图像图书馆。

关于c - erlang nif 共享库上的 undefined symbol ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27868890/

相关文章:

c - 何时在 C 中使用位域

java - 如何从n组不同大小的数字中选择n个数字?

Erlang 热代码加载

macos - 如何使用 distutils 和/或 setuptools 在 mac os x 上创建 .dylib C 扩展?

c - malloc qnx 以意想不到的方式工作

c - 在没有#including wchar 的情况下,前缀 L"..."在 GCC C 中代表什么?

list - 从另一个函数读取整数列表,然后对其求平方

erlang - 如何配置 lager 将日志发送到 papertrail 或 loggly

firefox-addon - 带有重复项的复杂动态和静态链接(Firefox 附加组件、WebRTC 和 VP8)

c - 将 R CMD SHLIB 与 OpenMP 一起使用不用于包构建