【问题标题】:tcmalloc: how can I get my malloc calls overridden when compiling statically?tcmalloc:如何在静态编译时覆盖我的 malloc 调用?
【发布时间】:2010-12-05 22:08:46
【问题描述】:

当我使用LD_PRELOAD=/usr/local/lib/libtcmalloc.so 时,我对 malloc 的所有调用都变成了 tcmalloc 调用。但是,当我静态链接 libtcmalloc 时,我发现直接 malloc 会被调用,除非我仍然使用 LD_PRELOAD 设置。

那么我怎样才能以这样的方式针对 tcmalloc 进行静态编译,以使我的 malloc 挂钩到 tcmalloc?

注意事项:

  • 我使用了很多新的 C++ 等,所以 只需#defining malloc 到 tcmalloc 不会工作
  • 可能我必须使用 malloc_hook 我自己,但我会 以为我可以让 tcmalloc 来做 对我来说,因为它显然正在这样做 动态链接时

【问题讨论】:

    标签: c++ linker malloc tcmalloc


    【解决方案1】:

    在第一次匹配的基础上解析符号。您需要确保链接器在之前 libc.a 搜索过 libtcmalloc.a。我假设您没有明确链接 libc.a,因为您通常不需要这样做。解决方案是指定 -nostdlibs,然后按照您希望搜索它们的顺序显式链接所有必要的库。通常是这样的:

    -nostdlibs -llibtcmalloc -llibm -llibc -llibgcc
    

    另一个可能更简单的解决方案是链接解析 tcmalloc 所需的目标文件而不是静态库,因为目标文件在解析符号时优先于库。

    【讨论】:

      【解决方案2】:

      TCMalloc 覆盖所有分配/解除分配函数调用,包括 New/Delete 的所有变体,以及 C API (malloc/免费的/calloc/realloc/valloc/pvalloc/mem_aligned /malloc_usable_size) 对于基于 gcc 的平台,它使用别名指令实现覆盖。

      我使用了很多 C++ 新的等,所以仅 #defining malloc to tcmalloc 是行不通的

      在 TCMalloc 标头中,malloc 已经别名为 tc_malloc,所以这没有任何作用。例如:

      #define ALIAS(tc_fn)   __attribute__ ((alias (#tc_fn), used))
      void* malloc(size_t size) __THROW               ALIAS(tc_malloc)
      

      至于New,请注意,与glibc和其他New(windows)的实现不同,它只是包装了malloc,tcmalloc的New不调用malloc。

      TCMalloc Newtc_newtc_newarray 的别名,这将调用 TCMalloc 的“神奇”内存管理器,在某些情况下,作为 libc malloc,将启动一个 sbrk/brk 系统调用。

      您需要做的另一件事是确保 gcc 不与 libc 的 malloc 变体链接。为此,请在 Makefile 中的 C++ 标志中添加以下内容:

      -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free
      

      另外,别忘了指定 TCMalloc 静态库:

      LIB_TCMALLOC = $(TCMALLOC_LIB_DIR)/libtcmalloc_minimal.a
      LIB_DIR := .... -L$(TCMALLOC_LIB_DIR) ...
      LIBS := ... -static $(LIB_TCMALLOC) ...
      

      可能我必须自己使用 malloc_hook,但我原以为我可以让 tcmalloc 为我做这件事,因为它显然是在动态链接时做的

      TCMalloc 不使用 malloc_hooks,由于线程安全问题,它现在被认为已弃用。它只是利用了内存分配方法是弱符号的事实。它通过函数调用使用别名(在 gcc 中)__attribute__((alias)) 覆盖这些符号。

      请参考: https://github.com/gperftools/gperftools/blob/master/README

      【讨论】:

      • 动态链接 libtcmalloc 似乎不适用于 -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free 。链接 LDD 后没有将 libtcmalloc.so 列为共享对象依赖项之一? @daniel Helper 您能否详细说明为什么这不起作用?
      猜你喜欢
      • 2014-02-05
      • 1970-01-01
      • 2017-03-16
      • 2013-05-13
      • 1970-01-01
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      • 2020-04-08
      相关资源
      最近更新 更多