作者:马黛茶总部 | 来源:互联网 | 2023-05-27 15:19
我正在尝试将我的共享库(一个erlang nif)链接到另一个共享库(libpurple),它使用dlopen加载其他共享库(插件).
问题是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
看起来问题是dlopen在erlang上调用:load_nif,这段代码和erlang nif有同样的问题,RTLD_NOW | RTLD_GLOBAL修复它,但我无法改变erlang如何调用dlopen ...
#include
#include
#include
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