为什么共享库(.so文件)作为私有加载?

时间:2016-10-17 17:19:32

标签: linux shared-libraries .so

这是来自一个smaps文件:
b750d000-b76bc000 r-xp 00000000 08:01 918842 /lib/i386-linux-gnu/libc-2.23.so
我相信p中的r-xp表示它是私有的。为什么会这样?如果将每个.so文件的副本加载到不同进程的不同内存地址中,这是否会破坏共享库的目的?这种私人装载有什么优势?

1 个答案:

答案 0 :(得分:0)

MAP_PRIVATE对应man mmapMAP_PRIVATE声称:

  

rw-p :创建私有写时复制映射。映射的更新对映射同一文件的其他进程不可见,并且不会传递到基础文件。 [...]

只要不进行修改,所有进程将共享此VMA的物理内存页面(它们也与内核缓存共享)。在给定流程中修改虚拟页面时,此流程的页面将被复制(取消共享)(写时复制)。

让我们来看看:

$ cat /proc/self/maps
00400000-0040c000 r-xp 00000000 08:11 529223                             /bin/cat
0060b000-0060c000 r--p 0000b000 08:11 529223                             /bin/cat
0060c000-0060d000 rw-p 0000c000 08:11 529223                             /bin/cat
[...]
  • 第一个和第二个VMA是只读的。它们(通常)不会被修改,并且(通常)将被所有进程共享。

  • 第三个VMA(arrayShuffle)是可写的,但在一个进程中的修改必须在其他进程中也不可见。此VMA包含(可变)全局变量,这些变量不由不同进程共享。