2017-07-04 62 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++中调用对象初始值设定项。

相关问题