9

を使用するLD_PRELOAD=/usr/local/lib/libtcmalloc.soと、malloc へのすべての呼び出しが tcmalloc 呼び出しになります。ただし、libtcmalloc に対して静的にリンクすると、LD_PRELOAD設定をまだ使用しない限り、そのまま malloc が呼び出されることがわかります。

では、malloc が tcmalloc にフックされるように、tcmalloc に対して静的にコンパイルするにはどうすればよいでしょうか?

ノート:

  • 私はC++の新しいものなどをたくさん使っているので、mallocをtcmallocに定義するだけではうまくいきません
  • おそらく私は自分で malloc_hook を使用する必要がありますが、動的にリンクするときに明らかにそれを行っているため、tcmalloc にそれを実行させることができると考えていました。
4

2 に答える 2

13

シンボルは最初の一致に基づいて解決されます。リンカによってlibc.aの前にlibtcmalloc.aが検索されることを確認する必要があります。通常はリンクする必要がないため、libc.aを明示的にリンクしていないと思います。解決策は、-nostdlibsを指定してから、必要なすべてのライブラリを検索したい順序で明示的にリンクすることです。通常は次のようなものです。

-nostdlibs -llibtcmalloc -llibm -llibc -llibgcc

より簡単な別の解決策は、静的ライブラリではなくtcmallocを解決するために必要なオブジェクトファイルをリンクすることです。これは、オブジェクトファイルがシンボルの解決においてライブラリよりも優先されるためです。

于 2009-10-12T09:17:51.233 に答える