如何在Linux中由两个不同的进程调用共享库文件?

在Linux中,我有一个名为foo.so的共享库文件当我执行2个不同的进程p1,p2,它们都使用foo.so. 这个foo.so是否被这两个过程重叠?

Solutions Collecting From Web of "如何在Linux中由两个不同的进程调用共享库文件?"

在基于Unix的系统(包括Linux)上, 代码段(.text)可以在多个进程之间共享,因为它是不可变的。 你提到这个重叠吗?

基本上,每个包含静态数据(如全局变量)的共享库都有一个全局偏移表(GOT) 。 在共享库上,所有对静态数据的引用(想到全局变量)都是通过GOT(它们是间接的)发生的。 因此,即使代码段是在多个进程之间共享的,每个进程都有其共享库的其他段的独占映射,包括相应的GOT,其条目被相应地重新定位。

简而言之, 只有代码在进程之间共享,而不是数据 。 不过,我认为常量可能是一个例外,取决于编译标志。

我也推荐以下文章: 动态链接和加载 。

共享库的代码被操作系统复制(或更准确地说,映射)到内存中。

然后操作系统给每个进程访问内存中的那一个副本。

有可能每个进程都将“看到”副本在另一个内存地址上。 这由CPU的内存管理单元解决。

它可能比这更复杂,但基本上,Linux和其他与Unix相关的操作系统(如Mac OS X)是如何工作的。