好记性不如铅笔头

linux, 编程

一种比较简单的替换malloc/free方法

好久没写笔记了,手都生了,这里简单的笔记一种比较简单的替换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/

发表评论

3 − 1 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据