微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

编译时不知道函数签名.

操作系统是RaspBerry PI上的Linux.

解决方法

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

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

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

原文地址:https://www.jb51.cc/c/116699.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐