如何从动态库中调用未知函数

How to call unknown function from dynamic library?

本文关键字:调用 未知 函数 动态      更新时间:2023-10-16

我需要实现从。so调用函数的能力,而不需要在编译时对函数有任何了解。我将只在运行时提供这些信息。我该怎么做呢?

我们可以假设我要调用的函数是从库中导出的,在库端不需要做任何事情。

编译时不知道函数签名。

操作系统为Linux on Raspberry PI

dlopendlsym(或它们的Windows对等物)允许您加载文件名在运行时确定的"共享对象"(编译代码的模块),然后检索其子程序的函数指针,其子程序的名称也在运行时确定。但是,每个这样的函数的类型签名——传递参数的数量和类型——仍然必须在编译时知道,以便您可以将dlsym返回的void *转换为正确的函数指针类型然后调用它。

如果您在运行时之前不知道要传递的参数的数量和类型,那么dlopendlsym是不够的,事实上,这是仍然需要少量手工编写的汇编语言的事情之一。在C或c++中,即使使用常见的编译器扩展,也没有办法合成其参数列表在运行时确定的调用。(GCC有听起来像的扩展,它们就是为了这个目的,但它们不够通用,除非在GCC自己的运行时库的内部深处有用。)

幸运的是,有人已经为你写好了汇编语言,并把它包装在一个很好的库中:libffi。它是可靠的,许可的,并支持您可能关心的每一个CPU和更多。在x86上,它还方便地平滑了Unix和Windows之间的一些差异。

听起来你需要linux的后期绑定。

你可以用dlopen加载你的共享库,然后使用dlsym来获取你的函数(前提是你知道这个函数的名字)。

之后,您需要使用签名信息来正确调用该函数(在编译时通常会将该指针强制转换为适当的类型)。

注意:不能在不同的操作系统中移植