2017-07-04 18 views
2

現在我在linux下編寫一個可加載的.so模塊,我想在主程序中使用dlopen,並在可加載的.so模塊中使用_init()。我的計劃是這樣的:在linux下使用dlopen()api時,我可以在_init()函數中添加參數嗎?

主程序:

... 
dlopen(lib, flags); 
... 

加載模塊:

#define MODULE_EXPORT(name, minit, mexit) \ 
    int __##name##_init(void) __attribute__((alias(#minit))); \ 
    void __##name##_exit(void) __attribute__((alias(#mexit))); 

MODULE_EXPORT(dump, dump_init, dump_exit); 

static int dump_init(void) 
{ 
... 
} 

現在我想添加PARAM到dump_init功能,像這樣:

static int dump_init(const char *param){} 

我不知道該怎麼做,或者我可以在linux中使用另一個新的API?謝謝〜

+0

如果你能做到這一點,第二次調用'dlopen'的參數會發生什麼情況,不需要初始化你的庫? –

回答

3

不,你不能將參數傳遞給共享庫初始值設定項。如果您需要將參數傳遞給庫,請使用常規函數。

(在圖書館的情況下,這應該是簡單的。 - 刪除MODULE_EXPORT宏,不要讓dump_init靜態剛剛從主機應用程序通常稱呼它)

一般來說,你應該避免明確定義初始化函數和終結函數。它們主要供編譯器內部使用,例如,在C++中調用對象初始值設定項。

相關問題