Я пытаюсь написать простую разделяемую библиотеку, которая регистрировала бы вызовы 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 извините за нехватку тегов, я не мог ' Не могу найти подходящие теги, а у меня все еще недостаточно репутации, чтобы создавать новые.