Cで関数を呼び出すだけでアドレスを知ることができ、 という情報はプロトタイプではありません(C関数ポインタにキャストできません)。プロトタイプのない関数としてCアドレスを呼び出す
この機能に関する情報は、アドレスです。
私はそれに渡すパラメータ(voidポインタのおかげで)と (voidポインタを介してアクセスされる)引数配列のサイズも知っています。
また、Cの呼び出し規約を尊重したいと思います。 x86版では、私はかなり (スペースをスタックに割り当て、そのスペースを にコピーして最後に関数を呼び出す方法)を知っています。
問題は、パラメータが のレジスタを通過するx64規約(Linuxの場合は現在)にあります。私は を適切に登録するために各パラメータのサイズを知りません、私はパラメータ配列のサイズを知っています。
また、gccに依存したくないので、 と思われる__builtin_applyを使用することはできません。
私はマルチコンパイラをサポートするために独自のコードを書いています。また、 は面白いものを学習します。
だから基本的に、私はある __builtin_applyと同じプロトタイプとして書きたい機能:
void *call_ptr(void (*fun)(), void *params, size_t size);
は、私はまた、C(ASMインラインのおかげで)でそれを書くためのコードまたは純粋のx64 ASMをしたいです。
これを適切に行うには、呼び出し元の の規約について、または、これはx35のコンベンションでは不可能です という関数のプロトタイプを正確に知らないのですか?
[libffi](http://sourceware.org/libffi/)をご覧ください。 – tangrs
これは素晴らしい選択肢ですが、libffiの問題は、各パラメータの型と関数の戻り値の型を知る必要があることです。可能であれば、これらの情報を収集しないようにして、時間の損失を避けたいと考えています。それでは、x64アーキテクチャで可能ですか? – Zerkan
@Zerkanいいえ、パラメータの型が必要です。引数を知らなくても関数を呼び出すときには、適切なレジスタやスタック空間にパラメータを置くことはできません。 – nos