2009-10-12 12 views
6

Quando uso LD_PRELOAD=/usr/local/lib/libtcmalloc.so, tutte le mie chiamate a malloc diventano chiamate tcmalloc. Tuttavia, quando collego staticamente contro libtcmalloc, trovo che viene chiamato direttamente malloc a meno che non utilizzi ancora l'impostazione LD_PRELOAD.tcmalloc: come posso annullare le chiamate al malloc durante la compilazione statica?

Quindi, come posso eseguire la compilazione statica di tcmalloc in modo tale che i mallocs si colleghino a tcmalloc?

Note:

  • sto usando un sacco di C++ nuova ecc, in modo solo #defining malloc per tcmalloc non funzionerà
  • Forse devo usare me malloc_hook, ma vorrei hanno pensato che avrei potuto ottenere tcmalloc farlo per me, dal momento che chiaramente sta facendo durante il collegamento in modo dinamico

risposta

11

I simboli sono risolti in base alla prima partita. È necessario assicurarsi che libtcmalloc.a venga ricercata prima del libc.a dal linker. Presumo che tu non stia esplicitamente collegando libc.a dato che normalmente non hai bisogno di farlo. La soluzione è specificare -nostdlibs, quindi collegare esplicitamente tutte le librerie necessarie nell'ordine in cui si desidera che vengano cercate. Di solito qualcosa di simile:

-nostdlibs -llibtcmalloc -llibm -llibc -llibgcc 

Un'altra soluzione che può essere più semplice, è quella 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 biblioteche nella risoluzione simboli.

Problemi correlati