没有STB_GNU_UNIQUE的静态链接stdc ++在dlclose

时间:2018-05-18 00:50:32

标签: dynamic memory-leaks static-linking gold-linker

我必须制作一个dso,即静态链接stdc ++并且需要可以从内存中卸载动态。所以我尝试使用--disable-gnu-unique-object编译gcc并使用带有-Wl,--no-gnu-unique选项的黄金链接。但两者都包含内存泄漏问题,即使我在main中调用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,我发现每次只有堆变化越来越大。 1000次后调用dlopen&amp;跟我说90M还是太大了。

026fb000-0274e000 rw-p 00000000 00:00 0                                  [heap]
经过大约两周的谷歌搜索后,这个问题没有任何帮助。只找到如下here所述的文件。

  

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

这是一个linux错误吗?在这个问题上有没有人能帮助我?谢谢。 环境是gcc 5.3.1。我链接了定义_GLIBCXX_USE_CXX11_ABI。

0 个答案:

没有答案