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

總之,我想有libffi動態查找功能(如果那是通過FFI在首位支持)相似dlfcn/LoadLibrary,然後用提供的FFI CIF類型調用它。

這樣的事情可能與libffi?一個簡單的例子會是什麼樣子?

回答

0

有兩種可能性 - 一種需要程序員的預謀。

根據o/s,有與共享庫相關的工具,用於從程序或其共享庫中查找符號。

在許多Unix系統和Linux具體地說,設施在<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年代初當共享庫不普遍可用的技術。再一次,需要強制轉換可能會使代碼更加複雜。

相關問題