如何从动态库中调用未知函数
How to call unknown function from dynamic library?
我需要实现从。so调用函数的能力,而不需要在编译时对函数有任何了解。我将只在运行时提供这些信息。我该怎么做呢?
我们可以假设我要调用的函数是从库中导出的,在库端不需要做任何事情。
编译时不知道函数签名。
操作系统为Linux on Raspberry PI
dlopen
和dlsym
(或它们的Windows对等物)允许您加载文件名在运行时确定的"共享对象"(编译代码的模块),然后检索其子程序的函数指针,其子程序的名称也在运行时确定。但是,每个这样的函数的类型签名——传递参数的数量和类型——仍然必须在编译时知道,以便您可以将dlsym
返回的void *
转换为正确的函数指针类型然后调用它。
如果您在运行时之前不知道要传递的参数的数量和类型,那么dlopen
和dlsym
是不够的,事实上,这是仍然需要少量手工编写的汇编语言的事情之一。在C或c++中,即使使用常见的编译器扩展,也没有办法合成其参数列表在运行时确定的调用。(GCC有听起来像的扩展,它们就是为了这个目的,但它们不够通用,除非在GCC自己的运行时库的内部深处有用。)
幸运的是,有人已经为你写好了汇编语言,并把它包装在一个很好的库中:libffi
。它是可靠的,许可的,并支持您可能关心的每一个CPU和更多。在x86上,它还方便地平滑了Unix和Windows之间的一些差异。
听起来你需要linux的后期绑定。
你可以用dlopen加载你的共享库,然后使用dlsym来获取你的函数(前提是你知道这个函数的名字)。
之后,您需要使用签名信息来正确调用该函数(在编译时通常会将该指针强制转换为适当的类型)。
注意:不能在不同的操作系统中移植
相关文章:
- 线程 std::调用未知类型,无法专门化函数错误
- 通过模板函数对未知类型调用方法
- 在库的未知类中调用函数
- CudaError未知代码= 30在任何cuda调用上
- 使用来自C++的任意数量的参数(在编译时未知)调用 Python 函数
- qml 未知方法返回类型:ArchiveFile*,即使调用了 qmlRegisterUncreatableType
- 从C++调用 Python 或 Lua 来计算表达式,仅在需要时计算未知变量
- std::p romise<void> 抛出未知错误,除非调用睡眠
- 当编译时参数未知时,不调用"constexpr"构造函数
- CUDA 未知错误后 cuBLAS 调用
- 当类型未知时调用模板方法
- 调用一个未知的构造函数(反射的替换)c++
- 有没有办法调用模板参数类的未知方法
- 调用具有未知数量参数的可变参数函数
- 如何继承构造函数,或如何使用未知数量的参数调用构造函数
- 从C#调用的C++中,返回一个长度先验未知的字符串
- 在运行时之前调用类型未知的模板化函数
- 通过抽象基类调用未知派生类的复制构造函数
- 如何从动态库中调用未知函数
- 从c++中调用未知(通过名称)lua函数