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

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

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

编译时不知道函数签名.

操作系统是RaspBerry PI上的Linux.

解决方法

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

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

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

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...