OILS / demo / ld_preload_hook.c View on Github | oilshell.org

38 lines, 24 significant
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
11FILE *fopen(const char *path, const char *mode) {
12 printf("Always failing fopen\n");
13 return NULL;
14}
15#endif
16
17#if 1
18static void *(*real_malloc)(size_t) = NULL;
19
20static 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
27void *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