【问题标题】:How to dlopen jemalloc dynamic library如何dlopen jemalloc动态库
【发布时间】:2018-11-23 03:45:56
【问题描述】:

我正在尝试在运行时 dlopen 内存分配器。 我对libctcmalloctbbmalloc 没有任何问题。但是尝试dlopen jemalloc 会导致以下错误(通过dlerror 捕获):

/path/to/lib/libjemalloc.so: cannot allocate memory in static TLS block

您知道这个错误的原因以及我该如何解决这个问题吗?

【问题讨论】:

  • 我不认为这些库被设计为使用dlopen 开放。
  • 在您拥有的 jemalloc 版本中似乎存在问题。在任何情况下,将动态库加载下界 dlopen 或 LoadLibrary 用于内存分配器都不是一个好主意。想象一下,当你在分配器已经卸载时调用free 函数时会发生什么。而是将共享库链接到可执行文件。
  • @SergeyA 你说的不是“设计为与dlopen 开放”是什么意思? @VictorGubin 我知道这个陷阱。我正在尝试设计一个子系统,以便能够在同一程序中使用多种分配策略。因此,链接共享库是不够的,确保使用好的分配器释放分配的内存是程序设计的一部分。
  • 它们被设计为通过动态加载器自动链接,并在程序开始执行之前可用。
  • 必须使用dlsym() 来检索分配器动态库提供的calloc()free()malloc()realloc() 函数要非常小心,不要使用另一个分配器的功能释放或重新分配一个分配器提供的指针。

标签: c++ c memory-management dlopen jemalloc


【解决方案1】:

感谢jemalloc 的 GitHub 存储库issue #1237,我能够找到解决方案。

这个解决方案是根据INSTALL.md使用--disable-initial-exec-tls重新编译jemalloc,我的错。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 2020-11-28
    • 2021-12-01
    • 1970-01-01
    • 2012-05-05
    相关资源
    最近更新 更多