#include #include #include #include #include //#define fprintf(...) /**/ //#define write(...) /**/ unsigned long val; static void *(*__libc_malloc)(size_t); static void *(*__libc_calloc)(size_t nmemb, size_t size); static void *(*__libc_realloc)(void *ptr, size_t size); static void (*__libc_free)(void *); static void dainit(void) { static int init = 0; if (init) return; val = 0; init = 1; void *t = dlopen("/lib/x86_64-linux-gnu/libc.so.6", RTLD_LAZY); if (!t)abort(); __libc_malloc = dlsym(t, "malloc"); __libc_calloc = dlsym(t, "calloc"); __libc_realloc = dlsym(t, "realloc"); __libc_free = dlsym(t, "free"); if (!__libc_malloc) abort(); if (!__libc_calloc) abort(); if (!__libc_realloc) abort(); if (!__libc_free) abort(); } static char zz[40]; void *malloc(size_t size) { if (!__libc_malloc && size == 40) return zz; dainit(); void *b[100]; int l; void *ret = __libc_malloc(size+8); fprintf(stderr, "XXX 0x%8.8x = malloc %ld\n", (unsigned)(unsigned long)ret, size); static int inside=0; if(inside++ == 0) { l = backtrace(b, 100); fprintf(stderr, "********************\n"); backtrace_symbols_fd(b, l, 2); fprintf(stderr, "********************\n\n"); } inside--; *(unsigned long *)ret = size; val += size; return (char *)ret+8; } static char z[32]; void *calloc(size_t nmemb, size_t size) { if (!__libc_calloc && nmemb == 1 && size == 32) return z; dainit(); //void *ret = __libc_calloc(nmemb, size); void *ret = __libc_malloc(nmemb*size+8); memset(ret, 0, nmemb*size+8); fprintf(stderr, "XXX 0x%8.8x = calloc %ld %ld\n", (unsigned)(unsigned long)ret, nmemb, size); *(unsigned long *)ret = nmemb*size; val += nmemb*size; return (char *)ret+8; } void *realloc(void *ptr, size_t size) { dainit(); void *b[100]; int l; void *ret; val += size; if (ptr) { val -= *(unsigned long *)((char*)ptr-8); ret = __libc_realloc((char*)ptr-8, size+8); } else ret = __libc_realloc(0, size+8); fprintf(stderr, "XXX 0x%8.8x = realloc %p %ld\n", (unsigned)(unsigned long)ret, ptr?(char*)ptr-8:0, size); static int inside=0; if(inside++ == 0) { l = backtrace(b, 100); fprintf(stderr, "********************\n"); backtrace_symbols_fd(b, l, 2); fprintf(stderr, "********************\n\n"); } inside--; *(unsigned long *)ret = size; return (char *)ret+8; } #include void free(void *p) { if (!p) return; if (p==zz || p==z) return; dainit(); char *t = "0123456789abcdef"; long z = (long)p; char s[512]; val -= *(unsigned long *)((char*)p-8); __libc_free((char*)p-8); z -= 8; s[0]='f'; s[1]='r'; s[2]='e'; s[3]='e'; s[4]=' '; s[5]='0'; s[6]='x'; s[7] = t[(z>>28) & 15]; s[8] = t[(z>>24) & 15]; s[9] = t[(z>>20) & 15]; s[10] = t[(z>>16) & 15]; s[11] = t[(z>>12) & 15]; s[12] = t[(z>>8) & 15]; s[13] = t[(z>>4) & 15]; s[14] = t[(z>>0) & 15]; s[15] = '\n'; write(2, "XXX ", 4); write(2, s+5, 10); write(2, " afree\n", 7); void *b[100]; int l; static int inside=0; if(inside++ == 0) { l = backtrace(b, 100); fprintf(stderr, "********************\n"); backtrace_symbols_fd(b, l, 2); fprintf(stderr, "********************\n\n"); } inside--; }