如何将C函数公开给自定义虚拟机?

时间:2011-09-24 16:10:51

标签: c interface function-pointers vm-implementation

我正在研究一个我希望能够与C接口的虚拟机。走另一条路并将虚拟机功能暴露给C代码相当容易,我无法理解的是暴露C对虚拟机起作用。

我希望能够像虚拟机一样动态注册C函数:

vm_register(printf);

然后在我的虚拟机中,将参数推送到堆栈,并且:

call printf

问题在于,在不知道函数需要多少个参数以及什么类型的情况下,我不确定可以使用函数指针。

是否存在可在此情况下使用的通用函数指针类型?有人能引导我朝着正确的方向前进吗?

1 个答案:

答案 0 :(得分:5)

一般的答案是你必须自己使用汇编来实现它。与libc链接后,您将拥有要调用的函数的地址,并且必须手动将参数传递给函数(使用运行虚拟机的任何平台的调用约定)。

幸运的是,有一个库libffi,它可以完全满足您的需求。它也很容易使用,它的来源包括一些文档和示例。如果您有兴趣了解其工作原理,可以查看其代码(例如calling a function using the unix calling convention)。

关于参数类型,您通常必须让用户为您描述它们并盲目地接受它并将它们进一步传递给libffi(如果您在没有libffi的情况下将其传递给硬件)。另一种方法是解析要调用的函数的C头文件,这不容易出错 - 但无论如何,实际上没有安全的方法,因为函数的二进制代码没有描述它的接口(使用printf及其变量参数列表更是如此)。