1

有人告诉我,一般来说,Linux 会避免加载同一个共享库的多个副本。我的问题实际上是关于这种机制有多强大。如果同一库的多个副本存在于系统的多个位置,它们会在内存中共享吗?如果您 dlopen()'d 库(与仅链接它),这有什么不同。

4

2 回答 2

1

使用对mmap(2)系统调用的多次调用来加载动态库(通过动态加载程序ld.so(8)dlopen(3),通常使用来自 的代码) 。ld.so

通常,只读数据和代码是MAP_SHARED. 因此 RAM(以及由 MMU 和内核强制执行的内存映射)在所有进程之间共享。

当然,真正重要的是-ed(或-ed)的inode 。所以同一个共享库的两个文件副本不会被共享。(最好使用符号链接)。mmapexecve

通过顺序读取可以了解进程1234的内存映射/proc/1234/maps。例如,cat /proc/$$/maps在终端中尝试。有关伪文件系统的详细信息,请参见proc(5) 。/proc/也试试lsof

于 2013-09-14T19:13:06.823 回答
1

如果库作为磁盘上的多个文件存在,则它不是共享的,因为系统无法确定它们实际上是相同的。

于 2013-09-14T19:22:48.597 回答