В разделяемой библиотеке функция func1() имеет atexit(terminate_global), и эта разделяемая библиотека не имеет «атрибута ((конструктор))» и «атрибут (( деструктор))».
Итак, поток программы выглядит следующим образом:
1) Приложение загружает разделяемую библиотеку с помощью dlopen.
2) Приложения вызывают func1() с помощью dlsym.
3) func1() имеет atexit(terminate_global).
4) функция func1() возвращает значение.
5) Приложение вызывает dlclose для освобождения библиотеки.
В приведенных выше шагах я не обнаружил, что atexit() вызывается при выгрузке библиотеки. Итак, каким должен быть правильный способ, если atexit() должен вызываться, когда мы освобождаем разделяемую библиотеку? Должен ли я экспортировать подпрограммы, используя атрибуты функций attribute((constructor)) и attribute((destructor)), чтобы можно было вызвать зарегистрированную функцию atexit?
atexit()
, а не библиотеку. Не усложняйте вещи. Если библиотеке нужна очистка, то она должна просто экспортировать некоторые функции, и приложение должно вызывать их при выходе. - person Matt   schedule 30.03.2015atexit()
запускается при закрытии самой программы, а не при выгрузке библиотеки/плагина. Для этого вам нужно добавить функцию деинициализации в вашу библиотеку. - person Galik   schedule 30.03.2015