【问题标题】:Why are shared libraries (.so files) loaded as private?为什么将共享库(.so 文件)加载为私有库?
【发布时间】:2024-01-18 02:58:01
【问题描述】:
这是来自 smaps 文件:
b750d000-b76bc000 r-xp 00000000 08:01 918842 /lib/i386-linux-gnu/libc-2.23.so
r-xp 中的 p 表示它是作为私有加载的,我相信。为什么会这样?如果将每个 .so 文件的副本加载到不同进程的不同内存地址中,这是否会破坏共享库的目的?这种私人装载有什么优势?
【问题讨论】:
标签:
linux
shared-libraries
.so
【解决方案1】:
p 对应于MAP_PRIVATE。 man mmap 声称:
MAP_PRIVATE:创建私有 copy-on-write 映射。映射的更新对映射同一文件的其他进程不可见,并且不会传递到基础文件。 [...]
此 VMA 的物理内存页面将由所有进程共享只要不进行任何修改(它们也与内核缓存共享)。当虚拟页面在给定进程中被修改时,该页面会被复制(不共享)用于该进程(copy-on-write)。
我们来看看:
$ 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
[...]