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

时间:2014-07-09 13:26:34

标签: c++ c shared-libraries

我需要在编译时实现从.so调用函数的能力,而不需要任何函数知识。我将仅在运行时提供该信息。我怎么能这样做?

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

编译时不知道函数签名。

OS是Raspberry PI上的Linux。

2 个答案:

答案 0 :(得分:11)

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

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

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

答案 1 :(得分:6)

听起来你需要late binding在Linux上。

您可以使用dlopen加载共享库,然后使用dlsym获取您的功能(前提是您知道该功能的名称)。

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

注意:这是 NOT 可在不同操作系统之间移植。