Обработчик atexit() аварийно завершает работу при доступе к символам из общей библиотеки dlopen()ed (dlclose() не вызываLinux

Ответить
Anonymous
 Обработчик atexit() аварийно завершает работу при доступе к символам из общей библиотеки dlopen()ed (dlclose() не вызыва

Сообщение Anonymous »

Я устраняю ошибку сегментации, возникающую во время завершения работы программы.
Моя основная программа делает что-то вроде этого:

Код: Выделить всё

#include 
#include 

void cleanup() {
// Access function or data from shared library
use_library_data();
}

int main() {
void* handle = dlopen("libfoo.so", RTLD_NOW);
atexit(cleanup);  // register cleanup
// ...
return 0;  // triggers exit()
}
Общая библиотека (libfoo.so) не регистрирует никаких обработчиков atexit().
Основная программа никогда не вызывает dlclose() — библиотека остается загруженной до выхода из процесса.
В моем реальном (большом) приложении я постоянно получаю ошибку сегментации во время завершения процесса внутри моего обработчика atexit().
Обратные трассировки указывают на сбои в деструкторах std::string или std::unordered_map при доступе к объектам общей библиотеки.
Вопрос:
Гарантируется ли, что глобальные/статические объекты из общей библиотеки остаются действительными до тех пор, пока не завершатся все обработчики atexit() из основной программы?
При каких обстоятельствах это может произойти? общая библиотека будет автоматически выгружена или финализирована перед запуском обработчика atexit(), даже если dlclose() никогда не вызывалась?

Подробнее здесь: https://stackoverflow.com/questions/797 ... ed-library
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»