В общей библиотеке функция func1 () имеет atexit (terminate_global), а в этой общей библиотеке нет ‘атрибут ((конструктор)) ‘и’атрибут ((Деструктор)).
Итак, поток программы выглядит так:
1) Приложение загружает разделяемую библиотеку, используя dlopen.
2) Приложения вызывают func1 (), используя dlsym.
3) у func1 () есть atexit (terminate_global).
4) func1 () возвращается.
5) Приложение вызывает dlclose для освобождения библиотеки.
В вышеприведенных шагах я не обнаружил, что atexit () был вызван, когда библиотека была выгружена. Итак, каким должен быть правильный путь, если atexit () должен быть вызван, когда мы перераспределяем разделяемую библиотеку? Должен ли я экспортировать подпрограммы, используя атрибут((конструктор)) и атрибут((деструктор)) атрибуты функции, чтобы можно было вызвать зарегистрированную функцию atexit?
Я предполагаю, что terminate_global
функция передана atexit
определяется в плагине. Если terminate_global
это Глобальный функция определяется основная программа (связан с -rdynamic
флаг, чтобы его символы обращались к плагинам), тогда плагин может вызвать atexit(terminate_global)
, но тогда я бы предоставил некоторую функцию API, делающую это.
Я не буду этого делать (звонит atexit(terminate_fun)
внутри какой-то плагин где terminate_fun
является функцией, определенной плагином), если вы не уверены, что ваше приложение никогда dlclose
Плагин
Если ваше приложение куда-то звонит dlclose
вне некоторых atexit
функция, которая dlclose
Скорее всего munmap
plugin.so
и когда позже exit
обрабатывает atexit
произойдет сбой (так как указатель на функцию зарегистрирован через atexit
является недействительным и не отображается)
Вы должны определить, кто отвечает за dlclose
Плагин Если ваше приложение явно делает это, вы можете выполнить некоторую очистку __attribute__((destructor))
Функция C (или деструктор некоторых статических данных C ++ в плагине), или определить и задокументировать конвенцию например, что каждый плагин, который имеет функцию с именем plugin_cleanup
(что вы получите с dlsym
) будет иметь соответствующую функцию очистки.
В противном случае вы можете определить и задокументировать, что плагины не являются эксплицитно dlclose
-d по вашей заявке (это часто нормально, особенно если вы предлагаете какую-то уборочную технику). Тем не менее, это может сделать valgrind
несчастный.