6

我正在开发一个我希望能够与 C 交互的虚拟机。反过来,将虚拟机功能暴露给 C 代码是相当容易的,我无法解决的是将 C 函数暴露给一个虚拟机。

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

vm_register(printf);

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

call printf

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

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

4

1 回答 1

5

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

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

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

于 2011-09-24T16:26:01.443 回答