- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在尝试将我的共享库(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/
在实现 NIF 时,Dialyzer 给了我 Function crc16/1 has no local return 可能是因为我做退出在 .erl 模块中(如官方文档推荐): -module(my
我正在编写一些 Erlang 代码,它基本上从 TCP 连接接受一些二进制数据,然后使用 C nif 解密数据并返回解密的数据。 问题是我似乎无法弄清楚如何修改传入的二进制文件。 这是我正在使用的功能
我会想,如果我所做的只是 1) 加载一个 NIF 库,2) 执行我的 new/0 方法,3) 通过 F() 释放一切,然后 4) erlang:garbage:collect()我会回到内存的起点。事
我正在尝试为简单的线性代数实现 NIF。这是我的矩阵内部结构: typedef struct la_matrix { uint rows, columns; double **data; }
我创建了一个 DLL“Addition.dll”,我在其中实现了 hello 函数这些是我用于创建库的文件: main.cpp : #include "main.h" //Hello function
我正在试验 NIF,但我对 Erlang 使用的数字类型感到困惑,因为我对自己的精确度感到有些奇怪。 这是一个例子: erlang:band(18446744073709551614, 5) == 4
我对 Erlang NIF 中的线程有一个小问题。您可以在这里查看我的代码:http://pastebin.com/HMCj24Jp .问题是,当我启动线程时,它需要一些参数并启动 generate_
我有一个通过串行端口实现特殊协议(protocol)的 C++ 代码。代码是多线程的,内部轮询串口并做自己的循环处理。我想从 erlang 调用这个驱动程序并接收来自这个驱动程序的事件。我担心的是这个
我有点困惑,当我创建一个脏 NIF(例如,通过在其 ErlNifFunc 条目中为脏 NIF 设置适当的标志值)时,这会创建一个在脏线程上运行的脏调度程序。 我知道我只能有 N 个 cpu-bond
如果我自己编写 escript,我可以使用 nif,但是当我使用 rebar escriptize 时,找不到 nif 函数。我认为这是因为 *.so 对象没有像 Beam 文件那样被打包。这是一个简
NIF 实现可以使用常规 C/C++ 线程锁定原语还是必须使用 NIF API(enif_mutex_lock(..)、enif_mutex_create(..)、 等) 最佳答案 来自 nif do
我发现Elixir程序可以通过NIFs (native implemented functions)或OS-level ports运行C代码。阅读了这些链接和类似链接后,我不清楚何时使用一种或另一种方
我打算使用 NIF 为我计划在 Erlang 中编写代码的应用程序操作二进制文件。下面给出了 NIF 的 cpp 文件和 erl 文件的要点链接。 [Erl 要点链接] https://gist.gi
是否可以从 NIF 调用 Erlang 函数(回调函数)? 我阅读了文档(http://www.erlang.org/doc/man/erl_nif.html),但没有找到如何做到这一点。 最佳答案
我观察到 C NIF 在被许多 Erlang 进程同时调用时的阻塞行为。可以做成非阻塞的吗?这里有我无法理解的互斥锁吗? 附言在特定的 PID 调用它的情况下,可以通过使其 sleep 一百个微秒来测
在编写 Erlang C NIF 时,如何将用 C 创建的指针(比如说数组)返回到 Erlang,以便稍后在另一个 NIF 调用中由同一 Erlang 进程使用? #define LENGTH =
我尝试使用 cygwin gcc 在 Windows 上编译一个 erlang nif 插件。它编译正常,但链接器出现一些错误: 对 `_enif_get_int' 的 undefined refer
我在尝试将我的共享库(erlang nif)链接到另一个使用 dlopen 加载其他共享库(插件)的共享库(libpurple)时遇到问题。 问题是 mylib.so 链接到 libpurple.so
当 Erlang VM beam 运行一些用 C 编写的代码时,其他用 Erlang 编写的进程没有被调度。例如: static ERL_NIF_TERM nifsleep(ErlNi
我正在使用 NIF 进行 C-Erlang 集成,但在初始化 Binary 时遇到了一些问题并添加 char*指向它的数据。 我是这样做的: ErlNifBinary *output_binary;
我是一名优秀的程序员,十分优秀!