Моя программа использует dlopen
для загрузки общего объекта, а затем dlclose
, чтобы выгрузить его. Иногда этот общий объект загружается еще раз. Я заметил, что статические переменные не были повторно инициализированы (что очень важно для моей программы), поэтому я добавил тест (dlopen
с RTLD_NOLOAD
) после dlclose
, чтобы увидеть, действительно ли библиотека действительно выгружена. Разумеется, он все еще был в памяти.
Затем я попытался называть dlclose
несколько раз, пока библиотека не выгрузится, но я получил бесконечный цикл. Это код, который я использую, чтобы проверить, была ли выгружена библиотека:
dlclose(handles[name]);
do {
void *handle = dlopen(filenames[name], RTLD_NOW | RTLD_NOLOAD);
if (!handle)
break;
dlclose(handle);
} while (true);
Мой вопрос: каковы возможные причины, по которым мой общий объект не выгружается после dlclose
, учитывая, что мои вызовы dlopen
являются единственными местами, где он загружается. Можете ли вы предложить курс действий для отслеживания источника проблемы? Кроме того, почему повторные вызовы на dlclose
не влияют, они каждый уменьшают счетчик ссылок, не так ли?
EDIT: Только что выяснилось, что это происходит только при компиляции с gcc. С clang все в порядке.