Здравствуйте.
Вот такой код падает из-за того, что dlsym у себя внутри сам использует calloc и при этом вызывается моя функция (еще неинициализированная). Как заставить dlsym использовать системный аллокатор?
#define _GNU_SOURCE
#include <stdbool.h>
#include <dlfcn.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
static void* (*sys_malloc)(size_t size) = NULL;
static void (*sys_free)(void *ptr) = NULL;
static void* (*sys_realloc)(void *ptr, size_t size) = NULL;
static void* (*sys_calloc)(size_t nmemb, size_t size) = NULL;
static void init_sys_functions(void);
static void
initialize(void)
{
static bool initialized = false;
if (!initialized) {
initialized = true;
init_sys_functions();
}
}
static void
init_sys_functions(void)
{
sys_malloc = dlsym(RTLD_NEXT, "malloc");
sys_free = dlsym(RTLD_NEXT, "free");
sys_realloc = dlsym(RTLD_NEXT, "realloc");
sys_calloc = dlsym(RTLD_NEXT, "calloc");
}
void*
malloc(size_t size)
{
initialize();
void* ret = sys_malloc(size);
return ret;
}
void
free(void* p)
{
initialize();
sys_free(p);
}
void*
calloc(size_t p1, size_t p2)
{
initialize();
return sys_calloc(p1, p2);
}
void*
realloc(void* p1, size_t s)
{
initialize();
return sys_realloc(p1, s);
}