tcmalloc:如何在静态编译时覆盖我的malloc调用?

kdt*_*kdt 8 c++ malloc linker tcmalloc

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

那么我怎么能以这样的方式静态编译tcmalloc,使我的mallocs挂钩到tcmalloc?

笔记:

  • 我正在使用大量的C++ new等,所以只有#defining malloc to tcmalloc才行
  • 可能我必须自己使用malloc_hook,但我想我可以得到tcmalloc来为我做,因为它显然在动态链接时这样做

Cli*_*ord 12

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

-nostdlibs -llibtcmalloc -llibm -llibc -llibgcc
Run Code Online (Sandbox Code Playgroud)

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