在 linux 下使用 dlopen() api 时,我可以在 _init() 函数中添加参数吗?
Could I add param in _init() function when using dlopen() api under linux?
现在我在 linux 下编写一个可加载的 .so 模块,我想在主程序中使用 dlopen
并在可加载的 .so 模块中使用 _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)
{
...
}
现在我想将参数添加到 dump_init 函数中,如下所示:
static int dump_init(const char *param){}
我不知道该怎么做,或者我可以在 linux 中使用另一个新的 api?谢谢~
不,您不能将参数传递给共享库初始化程序。如果您需要将参数传递给您的库,请使用常规函数。
(在您的图书馆的情况下,这应该很简单——删除 MODULE_EXPORT
宏,并且不要使 dump_init
静态化。只需从主机应用程序正常调用它即可。)
一般来说,您应该避免显式定义初始化函数和终结函数。它们主要供编译器内部使用,例如在 C++ 中调用对象初始值设定项。
现在我在 linux 下编写一个可加载的 .so 模块,我想在主程序中使用 dlopen
并在可加载的 .so 模块中使用 _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)
{
...
}
现在我想将参数添加到 dump_init 函数中,如下所示:
static int dump_init(const char *param){}
我不知道该怎么做,或者我可以在 linux 中使用另一个新的 api?谢谢~
不,您不能将参数传递给共享库初始化程序。如果您需要将参数传递给您的库,请使用常规函数。
(在您的图书馆的情况下,这应该很简单——删除 MODULE_EXPORT
宏,并且不要使 dump_init
静态化。只需从主机应用程序正常调用它即可。)
一般来说,您应该避免显式定义初始化函数和终结函数。它们主要供编译器内部使用,例如在 C++ 中调用对象初始值设定项。