Я играл с 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;
}