用malloc解释用户定义的包装器的工作

时间:2011-03-31 07:48:56

标签: c malloc wrapper

有人可以向我解释一下malloc包装器的工作情况吗?

RTLD_NEXT应该在搜索顺序中找到下一个syblo,这意味着它应该命中我的malloc,我没有放置任何分配方案,如原始malloc。

那么分配是怎么来的?

我在我的代码中做了类似的事情:

enter code here: tracer.cc
#define _GNU_SOURCE
#include <dlfcn.h>
#include <stdlib.h>
#include <stdio.h>
static void* (*lt_malloc)(size_t size);
#define LT_MALLOC (*lt_malloc)

void *malloc(size_t sz)
{
    printf("My malloc called");
    return LT_MALLOC(sz);
}

int main()
{
    if (!lt_malloc)
    {
           lt_malloc = (void*(*)(size_t))dlsym(RTLD_NEXT, "malloc");
        if (!lt_malloc)
        {
            fprintf(stderr, "LeakTracer: could not resolve 'malloc' in 'libc.so': %s\n", dlerror());
            exit(1);
        }
    }

    int *p=(int*)malloc(10);
    *p=34;
    printf("Address of p: %u, value: %d\n",p,*p);

    p=(int*)malloc(10);
    *p=45;
    printf("Address of p: %u, value: %d\n",p,*p); */

}

检查GDB输出,无处可去libc malloc。然后从何处进行内存分配?

enter code here
Breakpoint 1 at 0x804855d: file malloc1.c, line 25.

(gdb) s
The program is not being run.

(gdb) r
Starting program: /home/raj/timer_test/malloc_wrapper/a.out 

Breakpoint 1, main () at malloc1.c:25
25       int *p=(int*)malloc(20);

(gdb) s
malloc (sz=20) at malloc1.c:10
10       printf("My malloc called");

(gdb) s
11       return LT_MALLOC(sz);

(gdb) s
12      }

(gdb) s
main () at malloc1.c:26
26       *p=45;

(gdb) s
27       printf("Address of p: %u, value: %d\n",p,*p); 

(gdb) s
My malloc calledAddress of p: 146501640, value: 45
29       p=(int*)malloc(20);

(gdb) s
malloc (sz=20) at malloc1.c:10
10       printf("My malloc called");

(gdb) s
11       return LT_MALLOC(sz);

(gdb) s
12      }

(gdb) s
main () at malloc1.c:30
30       *p=56;

(gdb) s
31       printf("Address of p: %u, value: %d\n",p,*p); 

(gdb) s
My malloc calledAddress of p: 146501664, value: 56
32      }

(gdb) s
0x006a8e9c in __libc_start_main () from /lib/libc.so.6

(gdb) s
Single stepping until exit from function __libc_start_main, 
which has no line number information.

Program exited with code 043.
(gdb) 

我的困惑,是在哪一步以及如何调用libc原始malloc?为什么GDB无法跟踪它呢?

还有一个问题,假设在一定时间后(可能是计时器到期)我想调用原始的malloc而不是我的。怎么做?

1 个答案:

答案 0 :(得分:1)

我可能错了,但我认为发生的事情是,使用dlsym()调用你获取libc中malloc的地址,所以你的malloc函数充当了libc malloc的包装器[但同名] 你说:

  

“这意味着它应该击中我的malloc”

但你确定你的malloc的符号是第二个吗? ;)它可能是第一个,因为你的malloc在同一个编译单元中。