LINUX.ORG.RU

dlsym и malloc


0

2

Здравствуйте.

Вот такой код падает из-за того, что 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);
}

Дать своим функциям имена отличные от имен стандартной библиотеки C.

anonymous
()
Ответ на: комментарий от anonymous

Это библиотека, подключаемая через LD_PRELOAD.

elverion
() автор топика

На чём именно падает?
Что значит «неинициализированна» в отношении твоей функции?
Падает на бесконечной рекурсии?
Попробуй инициализировать указатели на системные функции при объявлении.

gpg
()
Ответ на: комментарий от gpg

>На чём именно падает?

Либо на бесконечной рекурсии, либо на обращении к функции sys_calloc (которая еще NULL). В зависимости от положения строки «initialized = true». Причем падает не всегда. Например простые тестовые примеры и ps отрабатывают нормально, но на ls падает сразу.

Попробуй инициализировать указатели на системные функции при объявлении.

Так нельзя.

elverion
() автор топика

Никогда не понимал людей, которые не пытаются решить проблему сами, прежде чем задать вопрос. В гугле полно информации по этому вопросу, специально проверил.

anonymous
()
Ответ на: комментарий от anonymous

С чего ты решил что я не пытался решить проблему?

elverion
() автор топика

Проблему конечно можно решить функцией __libc_calloc или даже выделяя память dlsym'у в глобальном массиве. Но это все костыли.

elverion
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.