куча возле стека в / proc / id / maps - PullRequest
3 голосов
/ 01 августа 2020

Я играл с malloc в общем объекте в Linux, проверяя макет памяти в / proc / id / maps, который выглядит следующим образом:

cat /proc/$(pgrep proc1)/maps
7f94331d0000-7f94331d1000 r-xp 00000000 00:00 160882             /mnt/c/SOmalloc/lib2.so
7f94331d1000-7f94331d3000 ---p 00001000 00:00 160882             /mnt/c/SOmalloc/lib2.so
7f94331d3000-7f94333d0000 ---p 00000003 00:00 160882             /mnt/c/SOmalloc/lib2.so
7f94333d0000-7f94333d1000 r--p 00000000 00:00 160882             /mnt/c/SOmalloc/lib2.so
7f94333d1000-7f94333d2000 rw-p 00001000 00:00 160882             /mnt/c/SOmalloc/lib2.so
7f94333e0000-7f94333e1000 r-xp 00000000 00:00 159995             /mnt/c/SOmalloc/lib1.so
7f94333e1000-7f94333e3000 ---p 00001000 00:00 159995             /mnt/c/SOmalloc/lib1.so
7f94333e3000-7f94335e0000 ---p 00000003 00:00 159995             /mnt/c/SOmalloc/lib1.so
7f94335e0000-7f94335e1000 r--p 00000000 00:00 159995             /mnt/c/SOmalloc/lib1.so
7f94335e1000-7f94335e2000 rw-p 00001000 00:00 159995             /mnt/c/SOmalloc/lib1.so
7f94335f0000-7f94337d7000 r-xp 00000000 00:00 736305             /lib/x86_64-linux-gnu/libc-2.27.so
7f94337d7000-7f94337e0000 ---p 001e7000 00:00 736305             /lib/x86_64-linux-gnu/libc-2.27.so
7f94337e0000-7f94339d7000 ---p 000001f0 00:00 736305             /lib/x86_64-linux-gnu/libc-2.27.so
7f94339d7000-7f94339db000 r--p 001e7000 00:00 736305             /lib/x86_64-linux-gnu/libc-2.27.so
7f94339db000-7f94339dd000 rw-p 001eb000 00:00 736305             /lib/x86_64-linux-gnu/libc-2.27.so
7f94339dd000-7f94339e1000 rw-p 00000000 00:00 0
7f94339f0000-7f94339f3000 r-xp 00000000 00:00 736328             /lib/x86_64-linux-gnu/libdl-2.27.so
7f94339f3000-7f94339f4000 ---p 00003000 00:00 736328             /lib/x86_64-linux-gnu/libdl-2.27.so
7f94339f4000-7f9433bf2000 ---p 00000004 00:00 736328             /lib/x86_64-linux-gnu/libdl-2.27.so
7f9433bf2000-7f9433bf3000 r--p 00002000 00:00 736328             /lib/x86_64-linux-gnu/libdl-2.27.so
7f9433bf3000-7f9433bf4000 rw-p 00003000 00:00 736328             /lib/x86_64-linux-gnu/libdl-2.27.so
7f9433c00000-7f9433c26000 r-xp 00000000 00:00 736281             /lib/x86_64-linux-gnu/ld-2.27.so
7f9433c26000-7f9433c27000 r-xp 00026000 00:00 736281             /lib/x86_64-linux-gnu/ld-2.27.so
7f9433e27000-7f9433e28000 r--p 00027000 00:00 736281             /lib/x86_64-linux-gnu/ld-2.27.so
7f9433e28000-7f9433e29000 rw-p 00028000 00:00 736281             /lib/x86_64-linux-gnu/ld-2.27.so
7f9433e29000-7f9433e2a000 rw-p 00000000 00:00 0
7f9433f70000-7f9433f73000 rw-p 00000000 00:00 0
7f9433f80000-7f9433f82000 rw-p 00000000 00:00 0
7f9434000000-7f9434001000 r-xp 00000000 00:00 767020             /mnt/c/SOmalloc/proc1
7f9434200000-7f9434201000 r--p 00000000 00:00 767020             /mnt/c/SOmalloc/proc1
7f9434201000-7f9434202000 rw-p 00001000 00:00 767020             /mnt/c/SOmalloc/proc1
7fffd6fe0000-7fffd7001000 rw-p 00000000 00:00 0                  [heap]
7fffde8f5000-7fffdf0f5000 rw-p 00000000 00:00 0                  [stack]
7fffdf439000-7fffdf43a000 r-xp 00000000 00:00 0                  [vdso]

Адрес кучи находится в около 0x7fffd6fe0000, что довольно близко к стеку. Насколько мне известно, куча обычно находится по низкому адресу, например 0x8402e60 (я использовал gdb, чтобы увидеть это), и между стеком и кучей есть огромный разрыв.

FYI, единственное "странное" "я написал функцию в общем объекте для вызова malloc и вызов этой функции в программе.

В lib1. c:

#include <stdlib.h>

void* lib1_malloc(size_t size)
{
    return malloc(size);
}

Обновление: параметры компиляции для lib1. c:

gcc -shared -fpic -o lib1.so lib1.c -g

И lib2. c имеет ту же функцию с изменением имени: lib2_malloc

Параметры компиляции для proc1. c:

gcc -o proc1 proc1.c -ldl -g

и proc1. c:

#include <dlfcn.h>
#include <stdlib.h>
#include <stdio.h>

int main()
{
    void* handle1, *handle2;
    void* (*malloc1)(size_t);
    void* (*malloc2)(size_t);
    void* (*realloc1)(void*, size_t);
    void* (*realloc2)(void*, size_t);

    handle1 = dlopen("./lib1.so", RTLD_LAZY);
    handle2 = dlopen("./lib2.so", RTLD_LAZY);

    malloc1 = dlsym(handle1, "lib1_malloc");
    malloc2 = dlsym(handle2, "lib2_malloc");
    realloc1 = dlsym(handle1, "lib1_realloc");
    realloc2 = dlsym(handle2, "lib2_realloc");

    //write something into the heap
    char *tmp1 = malloc1(32 * sizeof(char));
    for(int i = 0; i < 32; i++)
        tmp1[i] = 1;
    char *tmp = malloc(64* sizeof(char));
    for(int i = 0; i < 64; i++)
        tmp[i] = 2;
    char *tmp2 = malloc2(32 * sizeof(char));
    for(int i = 0; i < 32; i++)
        tmp2[i] = 3;

    tmp1 = realloc1(tmp1, 64 * sizeof(char));
    tmp = realloc(tmp, 32 * sizeof(char));
    tmp2 = realloc2(tmp2, 64 * sizeof(char));

    char aaa; //use scanf to stall the program
    scanf("%c", &aaa);

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...