C/C++动态加载未知原型的函数

R C*_*ell 3 c c++ linux interpreter dlsym

我正在编写一种运行时系统/解释器,我需要做的一件事就是调用位于外部库中的c/c ++函数.

在linux上我使用这些dlfcn.h函数来打开一个库,并调用一个位于其中的函数.问题是,当使用dlsysm()返回的函数指针需要在被调用之前被转换为适当的类型,以便知道函数参数和返回类型,但是如果我在库中调用一些任意函数那么显然我不会在编译时知道这个原型.

所以我要问的是,有没有办法调用动态加载的函数并传递参数,并在知道它的原型的情况下检索它的返回值?

到目前为止,我已经得出结论没有简单的方法来做到这一点,但我发现的一些解决方法是:

  • 确保我想要加载的所有函数都具有相同的原型,并为这些函数提供一些排序机制来检索参数和返回值.这就是我目前正在做的事情.

  • 使用内联asm将参数压入堆栈,并读取返回值.如果可能的话,我真的想避免这样做!

如果有人有任何想法,那将非常感激.

编辑:

我现在找到了我正在寻找的东西:

http://sourceware.org/libffi/

"便携式外部函数接口库"

(虽然我承认我原来的问题可以更清楚!)

Håv*_*d S 6

您要求的是C/C++是否支持函数反射(即在运行时获取有关其类型的信息).可悲的是答案是否定的.

您必须使函数符合标准契约(正如您所说的那样),或者开始实现在运行时调用函数而不知道其参数的函数.

由于不了解某个函数使其无法调用它,我认为你的解释器/"运行时系统"至少有一些用户输入或类似的东西,它可以用来推断它试图调用一个看起来像是那些东西的函数争论和返回不完全出乎意料的事情.这种查找本身很难实现,即使使用反射和一个不错的运行时类型系统也可以使用.混合使用调用约定,链接样式和平台,事情很快变得令人讨厌.

坚持您的计划,为您动态加载的功能强制执行明确定义的合同,并希望能够做到这一点.


bra*_*ing 1

我相信 ruby​​ FFI 库可以满足您的要求。它可以调用外部动态链接库中的函数,而无需专门链接它们。

http://wiki.github.com/ffi/ffi/

您可能无法直接在脚本语言中使用它,但也许这些想法是可移植的。

——布拉德·费兰 http://xtargets.heroku.com