Переопределение 'malloc' с использованием механизма LD_PRELOAD

Я пытаюсь написать простую разделяемую библиотеку, которая регистрировала бы вызовы malloc в stderr (что-то вроде «mtrace», если хотите).

Однако это не работает. Вот что я делаю:

/* 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;
    }
}

Я компилирую это с помощью:

gcc -shared -fPIC -o mtrace.so mtrace.c

А затем, когда я пытаюсь выполнить ls :

$ LD_PRELOAD=./mtrace.so ls
malloc(352) = Segmentation fault

Теперь я подозреваю, что dlopen нуждается в malloc, и поскольку я переопределяю его внутри разделяемая библиотека, она использует эту версию с еще не назначенным real_malloc .

Вопрос в том ... как мне заставить его работать?

PS извините за нехватку тегов, я не мог ' Не могу найти подходящие теги, а у меня все еще недостаточно репутации, чтобы создавать новые.

39
задан Alexey Kukanov 22 May 2011 в 04:59
поделиться