Primordial 'malloc' à l'aide du mécanisme de LD_PRELOAD
Je suis en train d'écrire une simple bibliothèque partagée qui aurait du journal des appels malloc sur la sortie stderr (une sorte de "mtrace" si vous voulez).
Toutefois, cela ne fonctionne pas.
Voici ce que je fais:
/* mtrace.c */
#include <dlfcn.h>
#include <stdio.h>
static void* (*real_malloc)(size_t);
void *malloc(size_t size)
{
void *p = NULL;
fprintf(stderr, "malloc(%d) = ", size);
p = real_malloc(size);
fprintf(stderr, "%p\n", p);
return p;
}
static void __mtrace_init(void) __attribute__((constructor));
static void __mtrace_init(void)
{
void *handle = NULL;
handle = dlopen("libc.so.6", RTLD_LAZY);
if (NULL == handle) {
fprintf(stderr, "Error in `dlopen`: %s\n", dlerror());
return;
}
real_malloc = dlsym(handle, "malloc");
if (NULL == real_malloc) {
fprintf(stderr, "Error in `dlsym`: %s\n", dlerror());
return;
}
}
J'ai compiler avec:
gcc -shared -fPIC -o mtrace.so mtrace.c
Et puis quand j'essaie d'exécuter ls
:
$ LD_PRELOAD=./mtrace.so ls
malloc(352) = Segmentation fault
Maintenant, je soupçonne que dlopen besoins de malloc, et comme je suis de la redéfinir au sein de la bibliothèque partagée, il utilise cette version avec la pas encore été assignés real_malloc
.
La question est...comment puis-je le faire fonctionner?
P. S. désolé pour le manque de balises, je ne pouvais pas trouver les balises appropriées, et je n'ai pas encore assez de réputation pour en créer de nouveaux.
- J'ai le même problème. Il semble que le constructeur fonction n'est pas appelée toujours.
- FTR: pour moi, c'était juste que
printf()
ne fonctionne pas avec surchargé malloc, maisfprintf()
n'.
Vous devez vous connecter pour publier un commentaire.
J'ai toujours le faire de cette façon:
Ne pas utiliser des constructeurs, initialiser au premier appel à
malloc
. UtilisationRTLD_NEXT
pour éviterdlopen
. Vous pouvez également essayer malloc crochets. Sachez que tous ceux qui sont des extensions GNU, et probablement pas travailler ailleurs.fprintf()
ne fera jamais appel àmalloc()
. Devraitfprintf()
utilisationmalloc()
, ce code spirale dans une récursion infinie.Si vous voulez vraiment utiliser LD_PRELOAD avec malloc et a constaté que le code de la accepté de répondre encore des erreurs de segmentation, j'ai une solution qui semble fonctionner.
L'erreur a été causée par dlsym appel calloc de 32 octets, provoquant une récursivité à la fin de la pile.
Ma solution a été de créer un super-simple statique allocateur qui prend soin des allocations avant dlsym retourne le pointeur de fonction malloc.
Espère que cela aide quelqu'un.
__sync_fetch_and_add
et__sync_fetch_and_sub
? Est-il définir des barrières de la mémoire?Si vous utilisez de la glibc, vous devez utiliser ses construit en malloc mécanisme d'accrochage - l'exemple de cette page est un exemple de la façon de rechercher l'origine de malloc. Ceci est particulièrement important si vous êtes en train d'ajouter des informations de suivi supplémentaires pour les allocations, pour assurer des fonctions de la bibliothèque de retour de malloc avais tampons sont compatibles avec votre
free()
mise en œuvre.Ici est l'exemple le plus simple pour les malloc et free accrochage.
Voici une extension pour les exemples ci-dessus qui évite les erreurs de segmentation dans dlsym en utilisant
mmap
jusqu'à ce que l'initialisation est terminée: