【问题标题】:How do I load my own library dynamically, and invoke a method in it?如何动态加载我自己的库,并在其中调用方法?
【发布时间】:2013-02-19 03:42:19
【问题描述】:

我想编写一些 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/,但这并不是我所需要的——这个项目仍然需要一个函数指针来进行函数调用。

即使没有具体的答案,我也将不胜感激。谢谢!

【问题讨论】:

  • C没有方法只有函数。

标签: c linux function shared-libraries


【解决方案1】:

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

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

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

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

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

请随意使用这个指针。

最后,当你完成时:

dlclose(lib)

注意:记得做错误检查!

【讨论】:

  • 哇,感谢您的快速回复!听起来和我要找的完全一样。
  • @jstrom:当然!乐意效劳。顺便说一句,欢迎来到 SO!第一个问题好。希望你回来!看起来您也阅读了常见问题解答——耶! :)。
  • 您可能希望在路径中添加/,例如dlopen("./lib.so");,否则使用LD_LIBRARY_PATH或其内置等效项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-19
  • 1970-01-01
  • 2017-08-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多