如何动态加载自己的库,并在其中调用方法?

时间:2013-02-19 03:42:19

标签: c linux function shared-libraries

我想编写一些C代码(好吧,如果它只能在Linux上运行)来动态加载新的共享库,然后从中调用一个方法(在运行时确定)。这似乎已经成为可能,因为java可以动态加载本机库,然后从它们调用方法。

例如,我想做类似的事情:

int main() {
    libinfo_t * lib_details = load_shared_library("libfoo.so");
    run_method(lib_details, "bar", 7);
}

这将使用参数7调用方法'bar'(bar是编译为libfoo.so的方法)。

用例详细信息:

我想编译一个二进制文件,它在目录中加载所有共享库,并在原始程序的内存上下文中运行每个共享库的一些方法。我希望能够通过在目录中添加/删除共享库来快速启用或禁用它。

概念证明:

根据java设法动态链接jni代码的方式,这似乎应该是可能的。您可以使用System.load(),并加载您选择的库。再加上内存编译,似乎它允许你从任意库运行任意函数。 http://www.java2s.com/Code/Java/JDK-6/CompilingfromMemory.htm

我尝试过的事情:

  1. 我查看了'uselib'的联机帮助页,这看起来很有用,但是一旦我加载它,我不知道该如何处理它。

  2. 一些谷歌搜索返回http://dyncall.org/,但这不是我需要的 - 这个项目仍然需要一个函数指针来进行函数调用。

  3. 即使没有具体的答案,我也会感激任何指向下一步的指针。谢谢!

1 个答案:

答案 0 :(得分:9)

Linux有一个非常完整的API。这是dlopen(3) API。

首先,使用文件名调用dlopen以获取共享库句柄:

void* lib = dlopen("./lib.so");

要获取此库中函数的函数指针:

int (*func)() = dlsym(lib, "thing");

请随意使用此指针。

最后,当你完成时:

dlclose(lib)

注意:请记住进行错误检查!