tcmalloc: Wie kann ich meine malloc Anrufe außer Kraft gesetzt bekommen, wenn statisch kompilieren?

StackOverflow https://stackoverflow.com/questions/1553435

  •  20-09-2019
  •  | 
  •  

Frage

Wenn ich LD_PRELOAD=/usr/local/lib/libtcmalloc.so verwenden, werden alle meine Anrufe zu malloc werden tcmalloc Anrufe. Wenn ich jedoch statisch gegen libtcmalloc verknüpfen, finde ich, dass gerade malloc heißt immer, wenn ich immer noch die LD_PRELOAD Einstellung.

Wie kann ich kompilieren statisch gegen tcmalloc so, dass mein mallocs Haken in tcmalloc?

Weitere Informationen:

  • Ich verwende eine Menge C ++ neu etc, so nur #defining malloc tcmalloc wird nicht funktionieren
  • Eventuell muss ich verwenden malloc_hook mich, aber ich hätte dachte, ich könnte tcmalloc bekommen, es zu tun für mich, da es tut es klar bei der Verknüpfung dynamisch
War es hilfreich?

Lösung

Symbole auf einer ersten Spiel Basis gelöst. Sie müssen sicherstellen, dass libtcmalloc.a gesucht vor libc.a durch den Linker. Ich gehe davon aus, dass Sie nicht explizit libc.a Verknüpfung, da Sie in der Regel nicht so tun müssen, um. Die Lösung ist -nostdlibs zu spezifizieren, und verknüpfen Sie dann explizit alle notwendigen Bibliotheken in der Reihenfolge, die Sie wollen, gesucht werden. Regel etwas wie:

-nostdlibs -llibtcmalloc -llibm -llibc -llibgcc

Eine andere Lösung, die einfacher sein kann, ist die Objektdatei (en) zu lösen tcmalloc erforderlich zu verbinden, anstatt die statische Bibliothek, da Objektdateien bei der Lösung Symbole Vorrang vor den Bibliotheken nehmen.

Andere Tipps

TCMalloc hat Vorrang vor allen Zuordnung / Aufhebung der Zuordnung Funktionsaufrufe, einschließlich aller Varianten von Neu / Löschen und C API ( malloc / kostenlos / calloc / realloc / valloc / pvalloc / mem_aligned / malloc_usable_size ) Für gcc-basierte Plattformen, erreicht sie die Überschreibung alias Direktive.

  

Ich bin mit vielen C ++ neu etc, so dass nur #defining malloc tcmalloc wird nicht funktionieren

In TCMalloc Header, malloc ist bereits aliased zu tc_malloc , so dass dies keine Auswirkungen. Zum Beispiel:

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

Wie bei Neu Bitte beachten Sie, dass im Gegensatz zu glibc und anderer Implementierung von Neu (Fenster), dass nur Wrapps malloc, tcmalloc Neues nicht Aufruf malloc.

TCMalloc Neu ist aliased zu tc_new und tc_newarray , die TCMalloc die "magische" Speicher-Manager, und in einigen Fällen nennen, wie libc malloc wird ein sbrk / brk Systemaufruf initiieren.

Eine andere Sache, die Sie tun müssen, ist sicherzustellen, dass gcc nicht Verbindung mit libc malloc Varianten. Dazu fügen Sie bitte zu C ++ Flags im Makefile der folgende:

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

Auch vergessen Sie nicht TCMalloc statische Bibliothek angeben:

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

Möglicherweise habe ich Gebrauch malloc_hook mich, aber ich hätte gedacht, ich tcmalloc es zu tun bekommen könnte für mich, da es klar es tut, wenn dynamisch verknüpfen

TCMalloc nicht malloc_hooks verwenden, die inzwischen veraltet aufgrund Thread Sicherheitsfragen berücksichtigt ist. Es nutzt einfach die Tatsache, dass der Speicher-Allokationsverfahren schwache Symbole sind. Er überschreibt diese Symbole entweder Aliase (in gcc) __attribute__((alias)) die durch Funktionsaufrufe.

Bitte beachten Sie: https://github.com/gperftools/gperftools/blob/master/README

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top