[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: