#include #include #include #include #include #ifdef INTERCEPT_PRELOAD #define load(name) \ if (((__real_ ## name) = dlsym(RTLD_NEXT, #name)) == NULL) { \ fprintf(stderr, "intercept: unable to load symbol '%s': %s", \ #name, strerror(errno)); \ return; \ } #define sym(name) name #define func_def(ret, name) static ret (*__real_ ## name) #else #define sym(name) __wrap_ ## name #define func_def(ret, name) extern ret __real_ ## name #endif func_def(void *, malloc)(size_t); static int mode = 0; static void fin(void) { if (mode > 0) fprintf(stderr, "intercept: stopped\n"); mode = 0; } static void init(void) { if (mode) return; mode = -1; #ifdef INTERCEPT_PRELOAD load(malloc); #endif atexit(fin); fprintf(stderr, "intercept: intercepting function calls\n"); mode = 1; } void *sym(malloc)(size_t size) { init(); // before call to malloc void *ret = __real_malloc(size); // after call to malloc return ret; }