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 に答える