2

我必须制作一个静态链接stdc++的dso,并且需要可以从内存中动态卸载。所以我尝试编译 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,我发现每次只有堆变化越来越大。在 1000 次调用 dlopen & dlclose 后大约 90M 对我来说 90M 仍然太大。

026fb000-0274e000 rw-p 00000000 00:00 0                                  [heap]

在谷歌上搜索了大约 2 周后,但对这个问题没有任何帮助。只在此处找到如下所述的文件。

-fno-gnu-unique 在具有最新 GNU 汇编器和 C 库的系统上,C++ 编译器使用“STB_GNU_UNIQUE”绑定来确保内联函数中模板静态数据成员和静态局部变量的定义是唯一的,即使存在“ RTLD_LOCAL"; 这是必要的,以避免两个不同的“RTLD_LOCAL”插件使用的库出现问题,这取决于其中一个插件的定义,因此在符号绑定方面不同意另一个。但这会导致受影响的 DSO 忽略“dlclose”;如果您的程序依赖于通过“dlclose”和“dlopen”重新初始化 DSO,则可以使用 -fno-gnu-unique。

这是一个Linux错误吗?有没有人可以帮助我解决这个问题?谢谢。环境是 gcc 5.3.1。我与定义 _GLIBCXX_USE_CXX11_ABI 相关联。

4

0 回答 0