进程地址空间中的.so和a.out文件的多个副本

时间:2013-04-09 15:50:34

标签: c linux

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

2 个答案:

答案 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。它是文件的最后一部分。我仍然无法解释为什么,但我发现了这一点。