为什么这样的lib被某个进程加载了不止一次?

时间:2012-09-21 04:58:45

标签: linux memory-management loadlibrary shared-libraries pmap

b7f27000     84K r-x--  /lib/libpthread-2.5.so
b7f3c000      4K -----  /lib/libpthread-2.5.so
b7f3d000      4K r----  /lib/libpthread-2.5.so
b7f3e000      4K rw---  /lib/libpthread-2.5.so
b7f3f000      8K rw---    [ anon ]
b7f41000     88K r-x--  /lib/libselinux.so.1
b7f57000      8K rw---  /lib/libselinux.so.1
b7f59000    256K r-x--  /usr/lib/libncurses.so.5.5
b7f99000     32K rw---  /usr/lib/libncurses.so.5.5
b7fa1000      8K rw---    [ anon ]
b7fa3000      4K r----  /usr/lib/locale/en_US.utf8/LC_MESSAGES/SYS_LC_MESSAGES
b7fa4000      4K r----  /usr/lib/locale/en_US.utf8/LC_PAPER
b7fa5000      4K r----  /usr/lib/locale/en_US.utf8/LC_NAME
b7fa6000      4K r----  /usr/lib/locale/en_US.utf8/LC_ADDRESS
b7fa7000      4K r----  /usr/lib/locale/en_US.utf8/LC_TELEPHONE
b7fa8000      4K r----  /usr/lib/locale/en_US.utf8/LC_MEASUREMENT
b7fa9000      4K r----  /usr/lib/locale/en_US.utf8/LC_IDENTIFICATION
b7faa000    108K r-x--  /lib/ld-2.5.so
b7fc5000      4K r----  /lib/ld-2.5.so
b7fc6000      4K rw---  /lib/ld-2.5.so
bf96f000    228K rw---    [ stack ]
 total    23740K

为什么这些lib的加载时间超过了更多?需要吗?为什么呢?

1 个答案:

答案 0 :(得分:3)

实际上,每个库只加载一次;您所看到的是每个库使用的多个内存区域

库包含代码,rodata和数据(+ bss)。代码是只读且可执行的(r-x),rodata是只读(r--),数据(和bss)是读写(rw-)。这些是您正在查看的内存段(请注意,它们都具有不同的内存保护标志和大小)。并非所有库都包含所有这些段,因此您将看到某些库只映射了两个(甚至一个)内存区域。

请注意,pmap的“总”输出仅测量虚拟内存利用率(即使对于小进程也可能非常高)。对于物理内存使用,请使用pmap -x并查看RSS(常驻集大小)。