c - 允许C动态加载库到 "publish"函数使用

标签 c shared-libraries dynamic-linking dynamic-library

我正在用 C 语言编写一个程序,它允许用户实现自定义“函数”以由某种解释器运行。我还希望允许用户用纯 C 编写这些自定义函数,然后动态加载。为此,我创建了两个结构,一个用于解释函数,一个用于 native 函数。

这是一个简化的例子:

struct func_lang {
    bool is_native;
    char* identifier;
    // various other properties
}

typedef void (*func_native_ptr)(int);
struct func_native {
    bool is_native;
    char* identifier;
    func_native_ptr func_ptr;
}

然后我使用每个结构的 identifier 属性将它们放入哈希表中,然后我可以使用它在运行时执行它们。

我的问题实际上来自另一端,加载的库。我希望能够允许加载的库“发布”他们想要插入到列表中的函数。例如,也许有这样的功能:

void register_func_native(char* identifer, func_native_ptr func_ptr);

然后,当我从库中调用 init 函数时,他们可以调用此函数将函数插入哈希表。

这行得通吗?我对如何链接 register_func_native 函数有点困惑,因为加载的库需要它,但必须由加载程序本身定义。我的加载程序函数是否需要在另一个共享库中实现,然后可以在运行时链接?

最佳答案

这将取决于平台,但在 Linux 和我见过的所有 Unix 上,它都可以工作。示例:

$ cat dll.c
void print(char const *);

void foo()
{
    print("Hello!");
}
$ gcc -Wall -shared -fPIC -o dll.so dll.c
$ cat main.c
#include <dlfcn.h>
#include <stdio.h>

void print(char const *msg)
{
    puts(msg);
}

int main()
{
    void *lib = dlopen("./dll.so", RTLD_NOW);
    void (*foo)() = (void (*)())dlsym(lib, "foo");
    foo();
    return 0;
}
$ cc -fPIC -rdynamic main.c -ldl
$ ./a.out 
Hello!

关于c - 允许C动态加载库到 "publish"函数使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14346934/

相关文章:

c - 为什么 "movl $1, %edx"而不是 "movl $0, %edx"

c++ - JNI 是否为 native 代码引入了额外的线程?

c - 哪种数据结构在共享内存场景和快速查找中效果最好

c++ - 了解动态链接在 UNIX 上的工作原理

linux - Dependency Walker 等同于 Linux?

c - dlopen:是否可以捕获未解析的符号, "manually"在它们发生时解析它们?

dll - 动态链接库(.dll、.so 等)有入口点吗?

c - 链接器如何解析动态加载库中的重复符号?

c - strtok 影响输入缓冲区

c - C 中的一个空循环。编译器是否生成了很多不必要的代码,或者我错过了什么?