【问题标题】: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_PRIVATEman 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
    [...]
    
    • 第一个和第二个 VMA 是只读的。它们(通常)不会被修改,而是(通常)由所有进程共享。

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

    【讨论】:

      最近更新 更多