0

libffi のマンページには、基本的に関数へのポインターが必要な例が示されています (例の場合はputs)。

ただし、関数の名前しか知らないが、実際にはポインターを持っていない場合はどうすればよいでしょうか (通常、動的プログラミング言語で ffi が使用されている場合に発生します)。

たとえば、次のようなことをしたい (疑似コード):

cif = null
s = "Hello World"
args = []
values = []
args[0] = ffi.type_pointer
values[0] = address_of(s)
if(ffi.prepare(cif, ffi.DEFAULT_ABI, ffi.type_uint, args)):
     ffi.call(cif, "puts", values)

要するに、dlfcn/LoadLibrary と同様に、libffi に関数を動的に検索させ (最初に ffi でサポートされている場合)、提供された FFI CIF タイプで呼び出します。

libffiでそのようなことは可能ですか?簡単な例はどのようになりますか?

4

1 に答える 1

0

2 つの可能性があります。

o/s に応じて、プログラムまたはその共有ライブラリからシンボルを検索するための共有ライブラリに関連付けられた機能があります。

多くの Unix システムと Linux では、機能は and と (and など) で宣言され<dlfcn.h>dlopen()dlsym()ますdlclose()。共有ライブラリの適切なハンドルを指定すると、次を使用できます。

int (*ffi_ptr)(const char *) = dlsym(ffi_handle, "ffi_function_name");

コンパイルの警告を避けるために、通常は残忍なキャストを検討する必要があります。

別の計画的な手法は、関数名と関数ポインターのテーブルを作成することです。このテーブルでは、名前を検索して、対応するポインターを使用できます。

struct ptr_function
{
    void (*func_ptr)(void);
    const char *func_name;
};

static const struct ptr_function[] =
{
    { func_1, "func_1"       },
    { func_2, "func_2"       },
    { func_2, "func_synonym" },
};

enum { NUM_PTR_FUNCTION = sizeof(ptr_function) / sizeof(*ptr_function) } ;

この手法では、dlsym()メカニズムではできない方法で同義語を使用できることに注意してください。ただし、事前の計画は、多くの場合、大きな障害になります。これは、共有ライブラリが普遍的に利用可能ではなかった 80 年代から 90 年代初頭にまでさかのぼる手法です。ここでも、キャストが必要なため、コードがやや複雑になる可能性があります。

于 2012-01-15T05:39:05.703 に答える