статическая ссылка stdc ++ без STB_GNU_UNIQUE вызывает утечку памяти при dlclose - PullRequest
0 голосов
/ 18 мая 2018

Мне нужно сделать dso, который статическая ссылка stdc ++ и может выгружать из памяти динамически.Поэтому я попытался скомпилировать gcc с --disable-gnu-unique-object и использовать золотую ссылку с -Wl,--no-gnu-unique параметрами.Но у обоих есть проблема с утечкой памяти, даже я ничего не делаю, кроме вызова dlopen() dlclose() в main.Тестовый код, такой как:

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.

...