首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >erlang nif共享库中的未定义符号

erlang nif共享库中的未定义符号
EN

Stack Overflow用户
提问于 2015-01-09 20:40:27
回答 1查看 913关注 0票数 6

我很难将我的共享库(一个erlang nif)链接到另一个共享库( link ),后者使用dlopen加载其他共享库(插件)。

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

代码语言:javascript
复制
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

我正在编纂如下:

代码语言:javascript
复制
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、RTLD_NOW _ RTLD_GLOBAL修复它的问题相同,但是我不能改变erlang调用dlopen的方式.

代码语言:javascript
复制
#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;
}

我唯一能找到的解决办法是像LD_PRELOAD=/usr/lib/libpurple.so erl一样调用erlang,但这还远远不够理想。

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

EN

回答 1

Stack Overflow用户

发布于 2015-09-22 22:06:59

Erlang没有加载带有全局符号的NIF库,这是有充分理由的--它将不可避免地污染全局名称空间。

理论上,我不知道这是否总是正确的,插件应该能够动态地加载它们的父库来查找它的符号,而不会导致OS加载库的另一个映像。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27868890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档