tcmalloc: come posso ottenere le mie chiamate malloc sovrascritti durante la compilazione in modo statico?

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

  •  20-09-2019
  •  | 
  •  

Domanda

Quando uso LD_PRELOAD=/usr/local/lib/libtcmalloc.so, tutte le mie chiamate a malloc diventare tcmalloc chiamate. Tuttavia, quando collego staticamente contro libtcmalloc, trovo che malloc retta è sempre chiamato a meno che non ho ancora utilizzare l'impostazione LD_PRELOAD.

Così come posso compilare staticamente contro tcmalloc in modo tale che i miei mallocs gancio in tcmalloc?

Note:

  • sto usando un sacco di C ++ nuova ecc, in modo solo #defining malloc per tcmalloc non funzionerà
  • Forse devo usare malloc_hook me, ma avrei pensato che avrei potuto ottenere tcmalloc per farlo per me, dal momento che chiaramente sta facendo quando si collegano in modo dinamico
È stato utile?

Soluzione

I simboli vengono risolti su una prima base partita. È necessario fare in modo che libtcmalloc.a viene cercato prima libc.a dal linker. Suppongo che non si sta collegando esplicitamente libc.a dal momento che normalmente non c'è bisogno di farlo. La soluzione è quello di specificare -nostdlibs, e quindi collegare esplicitamente tutte le librerie necessarie nell'ordine in cui si desidera loro di essere ricercati. Di solito qualcosa di simile:

-nostdlibs -llibtcmalloc -llibm -llibc -llibgcc

Un'altra soluzione che può essere più semplice, è quello di collegare il file oggetto (s) necessario per risolvere tcmalloc piuttosto che la libreria statica, dal momento che i file oggetto hanno la precedenza sulle librerie a risolvere i simboli.

Altri suggerimenti

TCMalloc sostituisce tutte le chiamate di funzione allocazione / deallocazione, comprese tutte le varianti di Nuovo / Elimina , e C API ( malloc / libero / calloc / realloc / valloc / pvalloc / mem_aligned / malloc_usable_size ) Per le piattaforme gcc base, raggiunge l'override direttiva using alias.

  

sto usando un sacco di C ++ nuova etc, quindi basta #defining malloc per tcmalloc non funzionerà

In intestazioni TCMalloc, malloc è già alias di tc_malloc , quindi questo non ha alcun effetto. Ad esempio:

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

Per quanto riguarda il Nuovo , si prega di notare che a differenza di glibc e altre applicazioni di Nuovo (finestre), che Wrapps solo malloc, nuovo di tcmalloc non chiama malloc.

TCMalloc Nuovo è alias per tc_new e tc_newarray , che chiamerà "magico" gestore della memoria di TCMalloc, e, in alcuni casi, come libc malloc, avvierà una chiamata di sistema sbrk / BRK.

Un'altra cosa che dovete fare è assicurarsi che GCC non creare un collegamento con le varianti malloc di libc. Per questo, si prega di aggiungere al C ++ Flags nel Makefile il seguente:

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

Inoltre, non dimenticate di specificare libreria statica TCMalloc:

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

Forse devo usare malloc_hook me stesso, ma avrei pensato ho potuto ottenere tcmalloc di farlo per me, dal momento che chiaramente sta facendo quando si collegano in modo dinamico

TCMalloc non usa malloc_hooks, che è ormai considerato obsoleto a causa di problemi di sicurezza thread. Esso utilizza semplicemente il fatto che i metodi di allocazione di memoria sono simboli deboli. Esso sostituisce quei simboli o utilizzando alias (a) gcc __attribute__((alias)) di per chiamate di funzione.

Si prega di fare riferimento a: https://github.com/gperftools/gperftools/blob/master/README

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top