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

17 c linux shared process

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

jwe*_*ich 36

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

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

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

我还推荐了以下书中的第10章动态链接和加载:链接器和加载.

  • 为了强调这一点,unixy系统可以共享或不共享动态库,但从应用程序的角度来看,任一实现之间都没有*可观察到的差异*.几乎所有类似unix的系统都会在进程之间共享代码,因为它很容易实现,并且几乎可以免费保存ram.极少数例外是具有弱(或没有)MMU的硬件上的偏执操作系统,这样共享的"文本"可能允许一个进程破坏另一个进程. (4认同)

Bob*_*phy 5

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

然后,操作系统为每个进程提供对内存中该一个副本的访问权限.

每个进程可能会"看到"副本处于与另一个不同的内存地址.这由CPU的内存管理单元解决.

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