gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:06:18 25 4
gpt4 key购买 nike

有人可以向我解释以下代码的 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 而不是我的。怎么做?

最佳答案

我可能是错的,但我认为正在发生的事情是,通过 dlsym() 调用,您获得了 libc 中 malloc 的地址,因此您的 malloc 函数充当了 libc malloc 的包装器 [但同名]你说:

"which means it should hit my malloc"

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

关于c - 用 malloc 解释用户定义的包装器的工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5496725/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com