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

前端之家收集整理的这篇文章主要介绍了c – 如何从动态库中调用未知函数?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要实现一个从.so调用函数的能力,而不需要在编译时知道函数.我将仅在运行时提供该信息.我怎样才能做到这一点?

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

编译时不知道函数签名.

操作系统是Raspberry PI上的Linux.

解决方法

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

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

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

原文链接:https://www.f2er.com/c/116699.html

猜你在找的C&C++相关文章