Re: C++ ?
> 3. Библиотека динамически загружает библиотеку от interbase6.0.1 (взят в
> rpm-ке с родного сайта) все работает, после выхода из тестовой программы
> (уже к этому времени сделано dlclose), получаю seg. fault. С
> библиотеками от sybase 11.0.3 все нормально. Если не использовать динамическую
> загрузку то завершение нормальное. Может кто-нибудь сталкивался с таким
> явлением или может объяснить его причины?
Это, возможно, известная дырка в компиляторе. Если библиотека от interbase
(или вообще, та, на которую вызван dlclose) написана на C++ и содержит
локальные статические объекты с деструктором, типа
void f()
{
static A some_static_var;
// ...
}
- то при завершении всего процесса будет плохо, так как рантайм планирует эти
деструкторы по atexit(), а в момент вызова код уже отсутствует в адресном
пространстве процесса (dlclose()). То же самое будет, если вообще какой-нибудь
код в dlclose()-нутой библиотеке запланирован на atexit(). Это, повторяю,
известная ошибка/особенность.
Обходных путей два: один - не вызывать dlclose(), второй - линковать
библиотеку линковщиком, а не грузить динамически.
--
jk
Reply to:
- Follow-Ups:
- Re: C++ ?
- From: Sergey Chumakov <yas@cit.org.by>