C erlang nif共享库上未定义的符号

C erlang nif共享库上未定义的符号,c,erlang,shared-libraries,dlopen,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: /

我在尝试将我的共享库(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上调用dlopen:load_nif,这段代码与erlang nif有相同的问题,现在RTLD_ | RTLD_全局修复了它,但我无法更改erlang调用dlopen的方式

#包括
#包括
#包括
void(*purple_util_set_user_dir)(常量字符*dir);
无效(*已启用紫色调试集)(已启用gboolean);
gboolean(*紫色核心初始值)(常量字符*ui);
int main()
{
void*lib=dlopen(“/usr/lib/libpurple.so”,RTLD_-LAZY);
purple_util_set_user_dir=dlsym(lib,“purple_util_set_user_dir”);
紫色调试集启用=dlsym(lib,“紫色调试集启用”);
purple_core_init=dlsym(lib,“purple_core_init”);
purple\u util\u set\u user\u dir(“/tmp/purpletest”);
紫色\u调试\u设置\u启用(真);
紫芯初始(“测试”);
返回0;
}
我唯一需要解决的问题是调用erlang,比如
LD_PRELOAD=/usr/lib/libpurple.so erl
,但这远远不够理想


看起来同样的问题,通过使用RTLD_GLOBAL解决了,

Erlang VM没有加载带有出于合理原因而公开的全局符号的NIF库-它将无法修复地污染全局命名空间


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

也许您需要将
libpurple
静态链接到
mylib。因此
@SteveVinoski我希望有另一种方法。。libpurple是一个很大的库,我不想自己把它重建成一个静态的verison