0

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

这是一个简化的示例:

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链接函数有点困惑,因为加载的库需要它,但必须由加载器本身定义。我的加载器功能是否需要在另一个共享库中实现,然后可以在运行时链接?

4

2 回答 2

2

它会起作用的。共享库可以看到您在主程序中拥有的所有全局符号。

在主程序中,您需要 dlopen() 和 dlsym() 来调用初始化函数。

于 2013-01-15T22:25:26.507 回答
2

这将取决于平台,但在 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!
于 2013-01-15T23:24:00.907 回答