【问题标题】:Could I add param in _init() function when using dlopen() api under linux?在 linux 下使用 dlopen() api 时可以在 _init() 函数中添加参数吗?
【发布时间】:2017-07-04 03:10:31
【问题描述】:

现在我在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?谢谢~

【问题讨论】:

  • 如果你能做到这一点,那么第二次调用 dlopen 而不需要初始化你的库的参数会怎样?

标签: c linux dlopen


【解决方案1】:

不,您不能将参数传递给共享库初始化程序。如果您需要将参数传递给您的库,请使用常规函数。

(在您的库的情况下,这应该很简单——删除 MODULE_EXPORT 宏,并且不要将 dump_init 设为静态。只需从主机应用程序中正常调用它即可。)

一般来说,您应该避免显式定义初始化器和终结器函数。它们主要供编译器内部使用,例如在 C++ 中调用对象初始值设定项。

【讨论】:

    猜你喜欢
    • 2010-12-08
    • 2017-11-30
    • 2011-09-25
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 2020-11-25
    • 2011-04-19
    • 2013-07-18
    相关资源
    最近更新 更多