linux - 如果同一个共享库被不同的应用程序和不同的目录加载,它是否在内存中共享?

标签 linux shared-libraries

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

最佳答案

通过多次调用 ld.so(8) 来加载动态库(通过动态加载器 dlopen(3) 或通过 mmap(2) ,它通常使用 ld.so 中的代码)。系统调用。

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

当然,真正重要的是 inode这是 mmap-ed(或 execve-ed)。因此,不会共享同一共享库的两个文件副本。 (最好使用符号链接(symbolic link))。

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

关于linux - 如果同一个共享库被不同的应用程序和不同的目录加载,它是否在内存中共享?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18803095/

相关文章:

c++ - std::thread 在使用-static-libstdc++ 时变弱,从而导致运行时崩溃

linux - 构建时如何让 bazel 使用外部存储?

linux - 为什么Linux没有病毒?

php - 将配置的 wordpress 主题/插件应用于多个网站

c - 如何使用 automake 创建 JNI/JNA 可以使用的共享库(dylib)?

linux - ncl:/lib/x86_64-linux-gnu/libssl.so.10: 找不到版本 `libssl.so.10'(ncl 要求)

android - 我可以在 Embarcadero C++Builder 中为 Android (*.so) 构建共享库吗?

php - 某些 PHP 文件上的 HTTP/1.1 500 273,在这些文件上出现空白页

linux - 如何以毫秒为单位获取 2 个日期(Z 格式)之间的差异

jenkins - 无法实例化 Jenkins 共享库中的对象