我看到堆栈,堆和共享库的地址范围从哪里开始。我看到共享库(我创建)和a.out的2个值。 ld和libc的3个值。 rest是匿名和堆栈区域的起始地址。
kg>pmap 24545
24545: ./a.out
003d3000 4K r-x-- [ anon ]
004d9000 4K r-x-- /home/trng3/sh/POC/libfile_sys.so
004da000 4K rwx-- /home/trng3/sh/POC/libfile_sys.so
08048000 4K r-x-- /home/trng3/sh/POC/a.out
08049000 4K rwx-- /home/trng3/sh/POC/a.out
46f46000 100K r-x-- /lib/ld-2.5.so
46f5f000 4K r-x-- /lib/ld-2.5.so
46f60000 4K rwx-- /lib/ld-2.5.so
46f68000 1244K r-x-- /lib/libc-2.5.so
4709f000 8K r-x-- /lib/libc-2.5.so
470a1000 4K rwx-- /lib/libc-2.5.so
470a2000 12K rwx-- [ anon ]
b7f8a000 4K rw--- [ anon ]
b7fa1000 4K rw-s- /dev/zero (deleted)
b7fa2000 8K rw--- [ anon ]
bfc0f000 84K rw--- [ stack ]
为什么我们有2份而不是1份。是一个来自磁盘而另一个是当前在内存中。在内存中使用相同数据的两个副本的目的是什么?
答案 0 :(得分:2)
它们不是多个副本,它们只是具有不同权限的不同段。查看可执行文件:
08048000 4K r-x-- /home/trng3/sh/POC/a.out 08049000 4K rwx-- /home/trng3/sh/POC/a.out
您可以看到第一个映射具有r-x
权限,第二个映射具有rwx
权限。通常,第二个映射将具有rw
权限,但是您的处理器可能无法设置无执行权限,或者该功能可能已关闭,可能该程序是使用可执行数据段编译的,或者可能是处理器没有所需的粒度。
我认为没有PAE的i386对于NX位具有非常粗糙的粒度,因此这可以解释为什么数据段是可执行的但是堆栈不是。
答案 1 :(得分:0)
46f46000 100K r-x-- /lib/ld-2.5.so
46f5f000 4K r-x-- /lib/ld-2.5.so
46f5f000 - 46f46000 = 25 * 4k = 100k。它是文件的最后一部分。我仍然无法解释为什么,但我发现了这一点。