Моя основная программа делает что-то вроде этого:
Код: Выделить всё
#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()
}
Основная программа никогда не вызывает dlclose() — библиотека остается загруженной до выхода из процесса.
В моем реальном (большом) приложении я постоянно получаю ошибку сегментации во время завершения процесса внутри моего обработчика atexit().
Обратные трассировки указывают на сбои в деструкторах std::string или std::unordered_map при доступе к объектам общей библиотеки.
Вопрос:
Гарантируется ли, что глобальные/статические объекты из общей библиотеки остаются действительными до тех пор, пока не завершатся все обработчики atexit() из основной программы?
При каких обстоятельствах это может произойти? общая библиотека будет автоматически выгружена или финализирована перед запуском обработчика atexit(), даже если dlclose() никогда не вызывалась?
Подробнее здесь: https://stackoverflow.com/questions/797 ... ed-library
Мобильная версия