Очистка интерпозиции функций с помощью dlsym

В качестве оболочки malloc я использую этот классический фрагмент кода:

#define _GNU_SOURCE
#include <stdio.h>
#include <stdint.h>
#include <dlfcn.h>

void* malloc(size_t size)
{
    static void* (*real_malloc)(size_t) = NULL;
    if (!real_malloc)
        real_malloc = dlsym(RTLD_NEXT, "malloc");

    void *p = real_malloc(size);
    fprintf(stderr, "malloc(%d) = %p\n", size, p);
    return p;
}

Valgrind расстроен, потому что в конце программы все еще есть буферы, выделенные dlsym.

==32691== 32 bytes in 1 blocks are still reachable in loss record 1 of 1
==32691==    at 0x4C279FC: calloc (vg_replace_malloc.c:467)
==32691==    by 0x528559F: _dlerror_run (dlerror.c:142)
==32691==    by 0x5285099: dlsym (dlsym.c:71)
==32691==    by 0x4060BC: malloc (memory.c:222)

Как я могу освободить эти ресурсы? Спасибо


person ziu    schedule 19.03.2012    source источник
comment
Может быть, я что-то здесь упускаю, и я не знаю, возможно ли вообще освободить этот буфер, но я бы просто проигнорировал его. Буфер dlsym будет освобожден при выходе из программы, и он нужен вам, пока программа работает.   -  person Thomas Padron-McCarthy    schedule 19.03.2012
comment
Меня это тоже не смущает, мне просто интересно.   -  person ziu    schedule 19.03.2012
comment
Ok. Вы вызываете dlclose? Этот буфер все еще остается?   -  person Thomas Padron-McCarthy    schedule 19.03.2012
comment
Я сделал это, но получил только ошибку утверждения Inconsistency detected by ld.so: dl-close.c: 719: _dl_close:assertion map-›l_init_call' failed!`   -  person ziu    schedule 19.03.2012


Ответы (1)


1 блок все еще доступен

Эти блоки прекрасны. Вам не нужно о них беспокоиться, это не утечки. Здесь не на что смотреть, идите дальше.

Это «определенно потерянный», о котором вы должны заботиться.

person Employed Russian    schedule 26.04.2012