| 1 | // Chaining malloc
 | 
| 2 | // https://stackoverflow.com/questions/6083337/overriding-malloc-using-the-ld-preload-mechanism
 | 
| 3 | 
 | 
| 4 | #define _GNU_SOURCE
 | 
| 5 | 
 | 
| 6 | #include <dlfcn.h>
 | 
| 7 | #include <stdio.h>
 | 
| 8 | #include <stdlib.h>
 | 
| 9 | 
 | 
| 10 | #if 0
 | 
| 11 | FILE *fopen(const char *path, const char *mode) {
 | 
| 12 |     printf("Always failing fopen\n");
 | 
| 13 |     return NULL;
 | 
| 14 | }
 | 
| 15 | #endif
 | 
| 16 | 
 | 
| 17 | #if 1
 | 
| 18 | static void *(*real_malloc)(size_t) = NULL;
 | 
| 19 | 
 | 
| 20 | static void mtrace_init(void) {
 | 
| 21 |   real_malloc = dlsym(RTLD_NEXT, "malloc");
 | 
| 22 |   if (NULL == real_malloc) {
 | 
| 23 |     fprintf(stderr, "Error in `dlsym`: %s\n", dlerror());
 | 
| 24 |   }
 | 
| 25 | }
 | 
| 26 | 
 | 
| 27 | void *malloc(size_t size) {
 | 
| 28 |   if (real_malloc == NULL) {
 | 
| 29 |     mtrace_init();
 | 
| 30 |   }
 | 
| 31 | 
 | 
| 32 |   void *p = NULL;
 | 
| 33 |   fprintf(stderr, "HOOK malloc(%ld) = ", size);
 | 
| 34 |   p = real_malloc(size);
 | 
| 35 |   fprintf(stderr, "%p\n", p);
 | 
| 36 |   return p;
 | 
| 37 | }
 | 
| 38 | #endif
 |