2012-01-15 30 views
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) 

が、私は(それが最初の場所でFFIでサポートされていた場合)を動的に同様の機能を調べるlibffiを持つようにしたいですdlfcn/LoadLibraryを使用して、指定されたFFI CIFタイプを使用して呼び出します。

libffiでこのようなことが可能ですか?単純な例はどのように見えますか?

答えて

0

2つの可能性があります - 1つはプログラマの側で予告を必要とします。

o/sに応じて、プログラムまたはその共有ライブラリからシンボルを検索するための共有ライブラリに関連する機能があります。多くのUnixシステムおよびLinuxの

は、具体的には、施設(ETC、およびdlclose()<dlfcn.h>で宣言さdlopen()dlsym()されています。共有ライブラリのための適切なハンドルを考えると、あなたが使用することができます。

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年代前半に遡るテクニックです。もう一度、キャストの必要性は、コードをいくらか複雑にする可能性があります。

関連する問題