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, mais fprintf() n'.