переопределение malloc на Mac OS

0

Я хочу переопределить выделение памяти в моей программе на Mac OS 10.9 с помощью DYLD_INSERT_LIBRARIES. Это очень простой скелет кода, который я реализовал:

void *(*default_malloc)(size_t) = NULL;
void (*default_free)() = NULL;
void *(*default_calloc)(size_t, size_t) = NULL;
void *(*default_realloc)(void *, size_t) = NULL;

void *malloc(size_t size)
{
    if(!default_malloc)
    {       
        default_malloc = dlsym(RTLD_NEXT, "malloc");    
    }

    size_t allocSize = size + 16;
    char *mem = (char *)default_malloc(allocSize);
    malloc_printf("malloc returned %p\n", mem + 16);
   return mem + 16;
}

void *calloc(size_t num, size_t size)
{
    if(!default_calloc)
    {
        default_calloc = dlsym(RTLD_NEXT, "calloc");
    }

    void *p = malloc(num*size);
    memset(p, 0, num*size); 
    malloc_printf("calloc function returned %p\n", p);
    return p;
}

void *realloc(void *xp, size_t size)
{
    if(!default_realloc)
    {
        default_realloc = dlsym(RTLD_NEXT, "realloc");
    }

    char *p = (char *)default_realloc((char *)xp - 16, size + 16);
    malloc_printf("realloc function returned %p\n", p + 16);
    return p + 16;  
}

void free(void *buff)
{
    if(buff == NULL)
    return;

    if(!default_free)
    {
        default_free = dlsym(RTLD_NEXT, "free");
    }

    char *mem = buff;
    malloc_printf("free function called for %p\n", mem);
    default_free(mem - 16);
}

Я не уверен, что здесь не так. Когда я запускаю свою программу с ней, я получаю следующий вывод:

$ DYLD_INSERT_LIBRARIES=lib_overrides.dylib ls
ls(2431) malloc: malloc returned 0x7fa6b0400030
ls(2431) malloc: malloc returned 0x7fa6b04000a0
ls(2431) malloc: malloc returned 0x7fa6b0400110
ls(2431) malloc: malloc returned 0x7fa6b0400130
ls(2431) malloc: free function called for 0x7fa6b04000a0
ls(2431) malloc: malloc returned 0x7fa6b04000a0
ls(2431) malloc: malloc returned 0x7fa6b04003c0
ls(2431) malloc: free function called for 0x7fa6b04003e0
ls(2431) malloc: *** error for object 0x7fa6b04003e0: pointer being freed was not allocated

Как free получить указатель 0x7fa6b04003e0? Он не возвращается malloc нигде, как предлагают журналы. Я много раз проверял код, но не смог найти проблему. Буду признателен за любую оказанную помощь. Незлая помощь.

ПРИМЕЧАНИЕ. Если я перестаю добавлять 16 из функций распределения и вычитаю 16 из бесплатных, то все будет хорошо. Значит ли это, что есть некоторая другая функция распределения, которая здесь не переопределяется (кроме malloc/calloc/realloc)?

Теги:
osx-mavericks
llvm-gcc

1 ответ

-1

realloc и free can и будут вызываться с нулевыми указателями. И, очевидно, вы столкнулись с проблемами с чем-либо, что было выделено раньше и освобождено после установки этих функций.

Посмотрите на инструменты и функции отладки.

  • 0
    Но я обработал для NULL бесплатно. Кроме того, библиотека должна быть загружена до libc, так как это возможно, что что-то выделяется до установки этих функций?
  • 0
    Все, что требует памяти, вызывает malloc. strdup например. Открытие файла выделит память, а закрытие файла освободит его. И так далее.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню