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

标签 c linux function shared-libraries

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

例如,我想做这样的事情:

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

即使没有具体的答案,我也会很感激任何关于下一步要看哪里的指示。谢谢!

最佳答案

Linux 对此有一个非常完整的 API。这是 dlopen(3)应用程序接口(interface)。

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

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

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

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

请随意使用此指针。

最后,当你完成时:

dlclose(lib)

注意:记得做错误检查!

关于c - 如何动态加载我自己的库,并调用其中的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14949460/

相关文章:

c - 为什么英特尔 SpeedStep 会影响执行周期数?

linux - 如何在 bash 命令参数中指定一组字符串

function - 使用 Horners 算法在 Haskell 中进行二进制到十进制的转换

c - 错误: a parameter list without types is only allowed in a function definition

Python - 存在一个在对象未实现函数时调用的函数?

c++ - C 与 C++ 的数值模拟(性能)

c - fopen 不适用于字符串参数

c - 为什么一个线性函数需要大括号?

linux - 使用反向代理记录所有传入的 HTTP 请求,然后在克隆服务器中执行它以进行性能测试

C SECCOMP 阻塞或关闭 STDIN/STDOUT