Могу ли я добавить параметр в функцию _init() при использовании API dlopen() под Linux?

Теперь я пишу загружаемый модуль.so под Linux, я хочу использовать dlopen в основной программе и использовании _init() в загружаемом модуле.so. Моя программа такова:

Основная программа:

...
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){}

Я не знаю, как это сделать, или я мог бы использовать другой новый API в Linux? Спасибо ~

1 ответ

Решение

Нет, вы не можете передавать аргументы инициализатору общей библиотеки. Если вам нужно передать параметры в вашу библиотеку, используйте обычную функцию.

(В случае вашей библиотеки это должно быть просто - удалите MODULE_EXPORT макрос, а не делать dump_init статичный. Просто позвоните как обычно из хост-приложения.)

Вообще говоря, вам следует избегать явного определения функций инициализатора и финализатора. Они в первую очередь предназначены для внутреннего использования компилятором, например, для вызова инициализаторов объектов в C++.

Другие вопросы по тегам