1
1
#include <string.h>
2
2
3
- // malloc/free wrapper
4
- // It simply calls the real malloc/free while recording all
5
- // currenly allocated memory in the heap_contents linked list.
3
+ // This file should be either linked with a C program directly, or
4
+ // compiled into a shared library and loaded via LD_PRELOAD.
5
+ //
6
+ // It overrides malloc/realloc/free, calling the real ones while recording
7
+ // all currenly allocated memory in the heap_contents linked list.
6
8
7
- void * __real_malloc (size_t );
8
- void __real_free (void * );
9
-
10
- // use weak symbols, to make wrapping of the following functions optional
11
- void * __attribute__ ( (weak )) __real_calloc (size_t , size_t );
12
- void * __attribute__ ( (weak )) __real_realloc (void * , size_t );
13
- char * __attribute__ ( (weak )) __real_strdup (const char * );
14
- char * __attribute__ ( (weak )) __real_strndup (const char * , size_t );
9
+ extern void * __libc_malloc (size_t );
10
+ extern void * __libc_realloc (void * , size_t );
11
+ extern void * __libc_calloc (size_t , size_t );
12
+ extern void * __libc_free (void * );
15
13
16
14
17
15
// list management //////////////////////////////////////////////////////////////
@@ -36,7 +34,7 @@ static void insert_or_update_pointer(void* pointer, int size, void* old_pointer)
36
34
}
37
35
}
38
36
39
- heap_node * node = __real_malloc (sizeof (* node ));
37
+ heap_node * node = __libc_malloc (sizeof (* node ));
40
38
node -> pointer = pointer ;
41
39
node -> size = size ;
42
40
node -> next = NULL ;
@@ -49,7 +47,7 @@ static void remove_pointer(void* pointer) {
49
47
heap_node * node = prev -> next ;
50
48
if (node != NULL && node -> pointer == pointer ) {
51
49
prev -> next = node -> next ;
52
- __real_free (node );
50
+ __libc_free (node );
53
51
break ;
54
52
}
55
53
}
@@ -58,39 +56,29 @@ static void remove_pointer(void* pointer) {
58
56
59
57
// wrappers ////////////////
60
58
61
- void * __wrap_malloc (size_t size ) {
62
- void * pointer = __real_malloc (size );
63
- insert_or_update_pointer (pointer , size , NULL );
64
- return pointer ;
65
- }
59
+ void * malloc (size_t size ) {
60
+ void * pointer = __libc_malloc (size );
61
+
62
+ // libc seems to allocte 1024 bytes on start for its own use. Ignore it.
63
+ if (!(heap_contents .next == NULL && size == 1024 ))
64
+ insert_or_update_pointer (pointer , size , NULL );
66
65
67
- void * __wrap_calloc (size_t n , size_t size ) {
68
- void * pointer = __real_calloc (n , size );
69
- insert_or_update_pointer (pointer , n * size , NULL );
70
66
return pointer ;
71
67
}
72
68
73
- void * __wrap_realloc (void * old_pointer , size_t size ) {
74
- void * pointer = __real_realloc (old_pointer , size );
69
+ void * realloc (void * old_pointer , size_t size ) {
70
+ void * pointer = __libc_realloc (old_pointer , size );
75
71
insert_or_update_pointer (pointer , size , old_pointer );
76
72
return pointer ;
77
73
}
78
74
79
- void __wrap_free (void * pointer ) {
80
- remove_pointer (pointer );
81
- __real_free (pointer );
82
- }
83
-
84
- char * __wrap_strdup (const char * s ) {
85
- char * new_s = __real_strdup (s );
86
- insert_or_update_pointer (new_s , strlen (new_s ) + 1 , NULL );
87
- return new_s ;
75
+ void * calloc (size_t n , size_t size ) {
76
+ void * pointer = __libc_calloc (n , size );
77
+ insert_or_update_pointer (pointer , n * size , NULL );
78
+ return pointer ;
88
79
}
89
80
90
- char * __wrap_strndup (const char * s , size_t n ) {
91
- char * new_s = __real_strndup (s , n );
92
- insert_or_update_pointer (new_s , strlen (new_s ) + 1 , NULL );
93
- return new_s ;
81
+ void free (void * pointer ) {
82
+ remove_pointer (pointer );
83
+ __libc_free (pointer );
94
84
}
95
-
96
-
0 commit comments