好久没写笔记了,手都生了,这里简单的笔记一种比较简单的替换malloc/free方法。
实现思路为利用环境变量LD_PRELOAD,在程序执行时优先加载自定义的动态链接库,使用自定义的malloc/free函数替换掉linux默认的函数。
首先看下代码:
//hello_malloc.c #include <stdio.h> #include <stdlib.h> int main() { void *p_buf = NULL; p_buf = malloc(128); if(p_buf != NULL) { printf("malloc buffer:%p \r\n", p_buf); free(p_buf); p_buf = NULL; }else { printf("malloc buffer fail\r\n"); } return 0; }
编译,执行
$ gcc hello_malloc.c -o hello_malloc $ ./hello_malloc malloc buffer:0x55b44be05260
动态库代码:
// my_malloc.c #define _GNU_SOURCE #include <stdio.h> #include <dlfcn.h> static void* (*real_malloc)(size_t size) = NULL; static void (*real_free)(void*) = NULL; static void __init(void) { if(real_malloc == NULL) { real_malloc = dlsym(RTLD_NEXT, "malloc"); } if(real_free == NULL) { real_free = dlsym(RTLD_NEXT, "free"); } } void *malloc(size_t size) { __init(); void *p_buf = real_malloc(size); fprintf(stderr, "my malloc called. size:%lu buf:%p \r\n", size, p_buf); return p_buf; } void free(void *ptr) { __init(); real_free(ptr); fprintf(stderr, "my free called. buf:%p \r\n", ptr); }
编译,执行,强制链接:
$ gcc -shared -fPIC my_malloc.c -o libmy_malloc.so $ LD_PRELOAD="./libmy_malloc.so libdl.so" ./hello_malloc my malloc called. size:128 buf:0x55cf68157260 my malloc called. size:1024 buf:0x55cf681572f0 malloc buffer:0x55cf68157260 my free called. buf:0x55cf68157260 $ ./hello_malloc malloc buffer:0x55aa37874260
参考链接:
【 https://stackoverflow.com/questions/6083337/overriding-malloc-using-the-ld-preload-mechanism 】
【 http://www.cs.cmu.edu/afs/cs/academic/class/15213-s03/src/interposition/ 】
发表评论