如何将C函数暴露给自定义虚拟机



我正在开发一个虚拟机,我希望它能够与C接口。另一种方式,将虚拟机函数暴露给C代码相当容易,我无法想象的是将C函数暴露给虚拟机。

我想能够动态注册C函数的虚拟机,像这样:

vm_register(printf);

然后在我的虚拟机中,将参数压入堆栈,并且:

call printf

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

是否有一个泛型函数指针类型,可以在这种情况下使用?有人能指引我正确的方向吗?

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

幸运的是,有一个库libffi,它可以完全满足您的需求。它也很容易使用,它的源代码包括一些文档和示例。如果你有兴趣了解它是如何工作的,你可以看一下它的代码(例如,使用unix调用约定调用函数)。

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

最新更新