首页 / 资讯中心 / 文章详情

【2019-10-12】一种比较简单的替换malloc/free方法

【2019-10-12】一种比较简单的替换malloc/free方法 ★ FEATURED ARTICLE
[历史归档]本文原发布于 cstriker1407.info 个人博客内容为历史存档仅供参考。发布时间2019-10-12 标题一种比较简单的替换malloc/free方法分类编程 / linux 标签linux·malloc·LD_PRELOAD·dlsym一种比较简单的替换malloc/free方法好久没写笔记了手都生了这里简单的笔记一种比较简单的替换malloc/free方法。实现思路为利用环境变量LD_PRELOAD在程序执行时优先加载自定义的动态链接库使用自定义的malloc/free函数替换掉linux默认的函数。首先看下代码//hello_malloc.c#includestdio.h#includestdlib.hintmain(){void*p_bufNULL;p_bufmalloc(128);if(p_buf!NULL){printf(malloc buffer:%p ,p_buf);free(p_buf);p_bufNULL;}else{printf(malloc buffer fail );}return0;}编译执行$ gcc hello_malloc.c-ohello_malloc $ ./hello_malloc malloc buffer:0x55b44be05260动态库代码// my_malloc.c#define_GNU_SOURCE#includestdio.h#includedlfcn.hstaticvoid*(*real_malloc)(size_tsize)NULL;staticvoid(*real_free)(void*)NULL;staticvoid__init(void){if(real_mallocNULL){real_mallocdlsym(RTLD_NEXT,malloc);}if(real_freeNULL){real_freedlsym(RTLD_NEXT,free);}}void*malloc(size_tsize){__init();void*p_bufreal_malloc(size);fprintf(stderr,my malloc called.size:%lu buf:%p ,size,p_buf);returnp_buf;}voidfree(void*ptr){__init();real_free(ptr);fprintf(stderr,my free called.buf:%p ,ptr);}编译执行强制链接$ gcc-shared-fPICmy_malloc.c-olibmy_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 myfreecalled. 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/ 】
阅读完成 · 觉得有帮助?
咨询建站