Задать вопрос
andrewsch
@andrewsch

Некорректный порядок вызова деструкторов при выгрузке динамической библиотеки?

Здравствуйте,


Я столкнулся с очень странной проблемой.


У меня есть динамическая библиотека на Linux, которая динамически подгружается и выгружается процессом два раза подряд (причем я не могу повлиять на логику процесса).


Первая пара вызовов dlopen/dlclose отрабатывают корректно — деструкторы статических переменных вызываются в порядке, обратном их созданию.


Второй вызов dlopen отрабатывает нормально. А вот второй (и все последующие) вызов dlclose приводит к тому, что деструкторы вызываются в порядке создания! В лучшем случае это проходит незаметно, но в худшем, если одна переменная пытается использовать другую, процесс валится по SEGFAULT.


Я попытался воспроизвести проблему с маленькой динамической библиотекой-пустышкой, но там все ок — никаких нарушений в порядке освобождения статических переменных. Проход с LD_DEBUG ничего полезного не выявил — dlclose/_fini вызыватся штатно (вроде).


Затем я попробовал добавить несколько вызовов atexit() и проследить, влияет-ли второй dlclose() на них. Оказалость, что да — их порядок тоже нарушается (сначала я думал, что это только касается финализации С++).


Я не обнаружил зависимости от версии gcc (пробовал 3.2/3.4/4.1.2) или дистры Linux (RHEL 4/5, SuSE 10). Поиск в Web не принес никаких похожих ссылок.


В реальной библиотеке (а она очень большая) я отчасти локализовал часть, включение которой начинает вызывать проблему, и буду еще копать в этом направлении.


Буду признателен за любые идеи — что еще можно попробовать, что почитать, где поискать…


С уважением,


Андрей
  • Вопрос задан
  • 2798 просмотров
Подписаться 2 Комментировать
Подписчики вопроса 2 К ответам на вопрос (1)