Статическая ссылка stdC++ без STB_GNU_UNIQUE вызывает утечку памяти при dlclose
Я должен сделать dso, что статическая ссылка stdC++ и необходимость может выгружаться из памяти динамически. Поэтому я попытался с компиляцией GCC с --disable-gnu-unique-object
и использовать золотую связь с -Wl,--no-gnu-unique
опции. Но оба содержат проблему утечки памяти, даже я ничего не делаю, кроме вызова dlopen() dlclose()
в основном. Код теста, как:
int main()
{
for(int i=0;i<1000;i++)
{
void * h=dlopen(filepath);
if(h)
dlclose(h);
}
return 0;
}
Чем я проверил память cat /proc/pid/maps
до и после я обнаружил, что только куча меняется все больше и больше каждый раз. Около 90 м после 1000 раз позвоните мне и получите 90 м по-прежнему слишком большой.
026fb000-0274e000 rw-p 00000000 00:00 0 [heap]
после гуглил около 2 недель но ничего полезного по этому вопросу. Только найдите документ, указанный ниже.
-fno-gnu-unique В системах с недавним GNU-ассемблером и библиотекой C компилятор C++ использует привязку "STB_GNU_UNIQUE", чтобы обеспечить уникальность определений статических членов-данных шаблона и статических локальных переменных во встроенных функциях даже при наличии "RTLD_LOCAL"; это необходимо для того, чтобы избежать проблем с библиотекой, используемой двумя разными плагинами "RTLD_LOCAL", в зависимости от определения в одном из них и, следовательно, от несогласия с другим относительно привязки символа. Но это приводит к тому, что "dlclose" игнорируется для затронутых DSO; если ваша программа использует повторную инициализацию DSO с помощью "dlclose" и "dlopen", вы можете использовать -fno-gnu-unique.
Это ошибка Linux? Кто-нибудь может мне помочь по этому вопросу? Благодарю. Окружающая среда - gcc 5.3.1. Я связался с определениями _GLIBCXX_USE_CXX11_ABI.