malloc_hook(3) allows you to globally insert your own malloc function. (There __realloc_hook __free_hook , etc., I just left them for simplicity.)
#include <stdio.h> #include <malloc.h> static void *(*old_malloc_hook)(size_t, const void *); static void *new_malloc_hook(size_t size, const void *caller) { void *mem; __malloc_hook = old_malloc_hook; mem = malloc(size); fprintf(stderr, "%p: malloc(%zu) = %p\n", caller, size, mem); __malloc_hook = new_malloc_hook; return mem; } static void init_my_hooks(void) { old_malloc_hook = __malloc_hook; __malloc_hook = new_malloc_hook; } void (*__malloc_initialize_hook)(void) = init_my_hooks;
$ cat> mem.c << 'EOF'
(the code above)
Eof
$ cc -fPIC -shared -o mem.so mem.c
$ LD_PRELOAD =. / Mem.so ls
0x7ffc14931adc: malloc (5) = 0xb40010
0x7ffc1492c6b0: malloc (120) = 0xb40030
0x7ffc1497f61a: malloc (12) = 0xb40010
0x7ffc1492be38: malloc (776) = 0xb400b0
...
printf can call malloc , so we temporarily undo the hook. Be careful if you move malloc any way.
source share