his is a short guide on how to override malloc / free in C/C++ on linux so that custom tracing / logging can be used on the functions to detect double free's
It is actually very simple to do. All you require is a short program that is compiled into a shared lib. Then this lib is pre loaded before your program loads and instead of binding to the libc functions it will bind to the ones in
the library.
#include <stdio.h>
#include <dlfcn.h>
extern void abort();
void *malloc(int size) {
void * (*ptr)(int);
void * handle = (void*) -1;
ptr = (void *) dlsym(handle, "malloc");
if (ptr == NULL) {
printf("Opps\n");
abort();
}
void *alloc = (*ptr)(size);
printf("Alloc = %p Size: %d\n", alloc, size);
return alloc;
}
void *realloc(void *alloc, int size) {
void * (*ptr)(void *, int);
void * handle = (void*) -1;
ptr = (void *) dlsym(handle, "malloc");
if (ptr == NULL) {
printf("Opps\n");
abort();
}
alloc = (*ptr)(alloc, size);
printf("Realloc = %p Size: %d\n", alloc, size);
return alloc;
}
void free(void *alloc) {
if (alloc == NULL)
return;
printf("free %p\n", alloc);
void * (*ptr)(void *);
void * handle = (void *) -1;
ptr = (void *) dlsym(handle, "free");
if (ptr == NULL)
abort();
(*ptr)(alloc);
}
You can compile the above with the following command
gcc -Wall sample.c -fPIC -shared -o libsample.so -lc -ldl
Then set the LD_LIBRARY_PATH= so that it includes the path to the location that the libsample.so is in.
Then set the LD_PRELOAD=libsample.so which will tell the dynamic lib loader to load that library first.
Then you can simply run your program.
Did You find this page useful?
Yes
No
Last Modified: 12 December 2016
Releated Posts
2017-04-25 - Linux Programming - Signals the easy way
2017-03-01 - Shooting yourself in the head with threads
2013-02-16 - C - Some simple examples of using strcat
2012-11-03 - C - How to override malloc / free
2012-08-09 - C++ - Check an IP Address is in a IP Mask
2012-06-16 - CPP - Using gperf
2012-04-05 - Using gdb to debug a core file
2012-03-15 - C - Is the stdin a tty
2012-03-13 - C - Converting from char / string to int using atoi
2012-03-08 - C - UDP Socket example
2012-02-20 - C - Get home dir location in linux
2012-02-17 - C - IP address validation
2012-02-15 - C - Get current ip address of an interface
2012-02-10 - Using asprintf instead of sprintf or snprintf
2012-01-31 - C - Example of how to overwrite argv
2012-01-30 - C - The string reverse
2012-01-27 - C - Palindrome
2012-01-26 - C - Example of using popen
2011-12-28 - C - gethostbyname example
2011-12-11 - C - Linux get mac address from interface