3

我看到了 stack 、 heap 和 shared library 的地址范围从哪里开始。我看到共享库(我创建的)和 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 个。一个是来自磁盘,另一个是当前在内存中。在内存中拥有相同数据的两个副本的目的是什么?

4

2 回答 2

2

它们不是多个副本,它们只是具有不同权限的不同段。查看可执行文件:

08048000 4K rx--/home/trng3/sh/POC/a.out
08049000 4K rwx--/home/trng3/sh/POC/a.out

可以看到第一个映射有r-x权限,第二个映射有rwx权限。通常,第二个映射将具有rw权限,但可能您的处理器无法设置非执行权限,或者该功能已关闭,可能程序是使用可执行数据段编译的,或者处理器可能没有所需的粒度。

我认为没有 PAE 的 i386 对 NX 位的粒度非常粗略,所以这可以解释为什么数据段是可执行的但堆栈不是。

于 2013-04-09T15:52:14.493 回答
0
46f46000    100K r-x--  /lib/ld-2.5.so    
46f5f000      4K r-x--  /lib/ld-2.5.so

46f5f000 - 46f46000 = 25 * 4k = 100k。它是文件的最后一段。我仍然无法解释原因,但我发现了这一点。

于 2013-04-09T15:54:26.877 回答