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

Ada*_*ski 6 c c++ shared-libraries

我需要实现一个从.so调用函数的能力,而不需要在编译时知道函数.我将仅在运行时提供该信息.我怎样才能做到这一点?

我们可以假设我要调用的函数是从库中导出的,库侧没有什么需要做的.

编译时不知道函数签名.

操作系统是Raspberry PI上的Linux.

zwo*_*wol 11

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

如果你不知道的参数的数量和类型传递到运行时,则dlopendlsym是不够的,而事实上,这是现在仍然是一件事,需要手工编写汇编语言适量的.在C或C++中,即使使用通用编译器扩展,也无法合成一个在运行时确定其参数列表的调用.(GCC的扩展听起来像是这样的,但它们不够通用,除了GCC自己的运行时库的内容之外.)

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


Mar*_* A. 6

听起来你需要在linux上进行后期绑定.

您可以使用dlopen加载共享库,然后使用dlsym获取您的函数(前提是您知道函数的名称).

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

注意:这不适用于不同的操作系统.

  • Windows上的等价物是`LoadLibrary`和`GetProcAddress` (2认同)