在/proc/id/maps中堆栈附近堆

在/proc/id/maps中堆栈附近堆,c,linux,heap,C,Linux,Heap,我在Linux中的共享对象中玩malloc,在/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/

我在Linux中的共享对象中玩
malloc
,在/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查看),堆栈和堆之间存在巨大的差距

仅供参考,我做的唯一“奇怪”的事情是在共享对象中编写一个函数来调用
malloc
,并在程序中调用此函数

在lib1.c中:

#包括
void*lib1\u malloc(大小)
{
返回malloc(大小);
}

更新: lib1.c的编译选项是:

gcc -shared -fpic -o lib1.so lib1.c -g
而lib2.c只是有着相同的函数,名称有点扭曲:
lib2\u malloc

proc1.c的编译选项是:

gcc -o proc1 proc1.c -ldl -g
和程序1.c:

#包括
#包括
#包括
int main()
{
无效*handle1、*handle2;
空隙*(*malloc1)(尺寸t);
空隙*(*malloc2)(尺寸t);
空隙*(*realloc1)(空隙*,尺寸t);
空隙*(*realloc2)(空隙*,尺寸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”);
//把东西写进堆里
char*tmp1=malloc1(32*sizeof(char));
对于(int i=0;i<32;i++)
tmp1[i]=1;
char*tmp=malloc(64*sizeof(char));
对于(int i=0;i<64;i++)
tmp[i]=2;
char*tmp2=malloc2(32*sizeof(char));
对于(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;//使用scanf暂停程序
scanf(“%c”和&aaa);
返回0;
}

我无法重现使用-fPIC和/或lib选项编译的内容是静态的还是动态的。你能详细介绍一下你是如何编译源代码、制作lib、制作proc1以及你所使用的操作系统的吗?你真的把120个MiB的间隔称为接近吗?堆栈底部为7fffde8f5000,堆结束于0x7fffd7001000,因此间隙为0x7fffde8f5000-0x7fffd7001000=0x78f40000=126828544。根据所有合理的预期,这个差距是正常的。我同意它并不接近,但正如我所提到的,在其他映射中,我看到堆总是位于相当低的地址,而不是以
0x7fff…
开始。我对程序内存布局的了解是,分配给共享对象的空间应该在堆和堆栈之间,这与上面的结果也不同@我在Windows101903上使用WSL,Ubuntu版本是18.04。我将很快发布代码并编译标志@brunoThere并不期望记忆以任何方式展现出来。因此,我不太确定有什么惊喜:操作系统和CRT做了他们通常做的事情?ASLR可能也在发挥作用。别指望什么。堆栈和堆可以在任何地方。