Library Interpositioning

Compile-Time Interpositioning

/*int.c*/

#include <stdio.h>
#include "malloc.h"

int main(){
	int *p = malloc(32);
	free(p);
	return 0;
}
/*malloc.h*/

#define malloc(size) mymalloc(size)
#define free(ptr) myfree(ptr)

void *mymalloc(size_t size);
void myfree(void *ptr);
/*mymalloc.c*/
#ifdef COMPILETIME
#include <stdio.h>
#include <malloc.h>

void *mymalloc(size_t size){
	void *ptr = malloc(size);
	printf("malloc(%d) = %p\n", (int)size, ptr);
	return ptr;
}

void myfree(void *ptr){
	free(ptr);
	printf("free(%p)\n", ptr);
}
#endif
linux> gcc -DCOMPILETIME -c malloc.c
linux> gcc -I. -o intc int.c mymalloc.o
/*mymalloc.c*/
#ifdef LINKTIME
#include <stdio.h>

void *__real_malloc(size_t size);
void __real_free(void *ptr);

void *__wrap_malloc(size_t size){
	void *ptr = __real_malloc(size);
	printf("malloc(%d)= %p\n", (int)size, ptr);
	return ptr;
}

void __wrap_free(void *ptr)
{
	__real_free(ptr);
	printf("free(%p)\n", ptr);
}
#endif
linux> gcc -DLINKTIME -c mymalloc.c
linux> gcc -c int.c
linux> gcc -W1,--wrap,malloc -W1,--wrap,free -o intl int.o myalloc.o

Run-Time Interpositioning

/*mymalloc.c*/
#ifdef RUNTIME
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>

void *malloc(size_t size){
	void*(*mallocp)(size_t size);
	char *error;
	
	mallocp = dlsym(RTLD_NEXT,"malloc");
	if((error = dlerror()) != NULL){
		fputs(error, stderror);
		exit(1);
	}
	char *ptr = mallocp(size);
	printf("malloc(%d) = %p\n", (int)size, ptr);
}
void free(void *ptr)
{
	void (*freep)(void *) = NULL;
	char *error;
	
	if (!ptr)
		return;
	
	freep = dlsym(RTLD_NEXT, "free"); /* Get address of libc free */
	if ((error = dlerror()) != NULL) {
		fputs(error, stderr);
		exit(1);
	}
	freep(ptr); /* Call libc free */
	printf("free(%p)\n", ptr);
}
#endif
linux> gcc - DRUNTIME -shared -fpic -o mymalloc.so mymalloc.c -ldl
linux> gcc -o intr int.c
linux> LD_PRELOAD="./mymalloc.so" ./intr
Powered by Forestry.md