как вызвать atexit в общей библиотеке?

В общей библиотеке функция func1 () имеет atexit (terminate_global), а в этой общей библиотеке нет ‘атрибут ((конструктор)) ‘и’атрибут ((Деструктор)).

Итак, поток программы выглядит так:

1) Приложение загружает разделяемую библиотеку, используя dlopen.

2) Приложения вызывают func1 (), используя dlsym.

3) у func1 () есть atexit (terminate_global).

4) func1 () возвращается.

5) Приложение вызывает dlclose для освобождения библиотеки.

В вышеприведенных шагах я не обнаружил, что atexit () был вызван, когда библиотека была выгружена. Итак, каким должен быть правильный путь, если atexit () должен быть вызван, когда мы перераспределяем разделяемую библиотеку? Должен ли я экспортировать подпрограммы, используя атрибут((конструктор)) и атрибут((деструктор)) атрибуты функции, чтобы можно было вызвать зарегистрированную функцию atexit?

1

Решение

Я предполагаю, что 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 несчастный.

0

Другие решения