Объясните работу пользовательской оболочки с помощью malloc - PullRequest
1 голос
/ 31 марта 2011

Может кто-нибудь объяснить мне, как работает оболочка 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) 

Мое замешательство, на каком этапе и как называется исходный malloc libc?И почему GDB не может отследить это?

Еще один вопрос, предположим, что через некоторое время (может быть истечет таймер) я хочу назвать оригинальный malloc, а не мой.Как это сделать?

1 Ответ

1 голос
/ 31 марта 2011

Я могу ошибаться, но я думаю, что происходит то, что с помощью вызова dlsym () вы получаете адрес для malloc в libc, поэтому ваша функция malloc действует как обертка вокруг libc malloc [ но с тем же именем] Вы говорите:

"что означает, что он должен ударить мой malloc"

но вы уверены, что символ вашего malloc является вторым? ;) Возможно, это первый, поскольку ваш malloc находится в том же модуле компиляции.

...