2009-10-12 6 views
6

Lorsque j'utilise LD_PRELOAD=/usr/local/lib/libtcmalloc.so, tous mes appels à malloc deviennent des appels tcmalloc. Cependant, quand je lie statiquement contre libtcmalloc, je trouve que malloc droit est appelé à moins que j'utilise toujours le paramètre LD_PRELOAD.tcmalloc: comment puis-je remplacer mes appels malloc lors de la compilation statique?

Alors comment compiler statiquement contre tcmalloc de telle sorte que mes mallocs puissent se connecter à tcmalloc?

Notes:

  • J'utilise beaucoup de C++ nouveau etc, donc juste #defining malloc à tcmalloc ne fonctionnera pas
  • Peut-être que je dois utiliser me malloc_hook, mais je ont pensé que je pourrais obtenir tcmalloc de le faire pour moi, car il est clairement fait qu'il lors de la liaison dynamique

Répondre

11

Les symboles sont résolus sur une base de premier match. Vous devez vous assurer que libtcmalloc.a est recherché avant libc.a par le lieur. Je suppose que vous ne liez pas libc.a explicitement puisque vous n'avez normalement pas besoin de le faire. La solution consiste à spécifier -nostdlibs, puis à lier explicitement toutes les bibliothèques nécessaires dans l'ordre dans lequel vous souhaitez les rechercher. Habituellement, quelque chose comme:

-nostdlibs -llibtcmalloc -llibm -llibc -llibgcc 

Une autre solution qui peut être plus simple, est de lier le fichier objet (s) nécessaire pour résoudre plutôt tcmalloc que la bibliothèque statique, car les fichiers objets ont la priorité sur les bibliothèques dans la résolution de symboles.

Questions connexes