在linux下使用dlopen()api时,我可以在_init()函数中添加参数吗?
问题描述:
现在我在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?谢谢〜
答
不,你不能将参数传递给共享库初始值设定项。如果您需要将参数传递给库,请使用常规函数。
(在图书馆的情况下,这应该是简单的。 - 删除MODULE_EXPORT
宏,不要让dump_init
静态刚刚从主机应用程序通常称呼它)
一般来说,你应该避免明确定义初始化函数和终结函数。它们主要供编译器内部使用,例如,在C++中调用对象初始值设定项。
如果你能做到这一点,第二次调用'dlopen'的参数会发生什么情况,不需要初始化你的库? –