在Linux中,我有一个名为foo.so的共享库文件.当我执行2个不同的进程p1时,p2都使用foo.so. 这个foo.so会被这两个进程重叠吗?
jwe*_*ich 36
在基于Unix的系统(包括Linux)上,代码段(.text)可以在多个进程之间共享,因为它是不可变的.你提到这个重叠吗?
基本上,每个包含静态数据的共享库(例如全局变量)都有一个全局偏移表(GOT).在共享库上,所有对静态数据的引用(想想全局变量)都是通过GOT(它们是间接的)发生的.因此,即使代码段在多个进程之间共享,每个进程也具有其共享库的其他段的独占映射,包括相应的GOT,其条目相应地重新定位.
简而言之,只有代码在进程之间共享,而不是数据.但是,我认为常量可能是一个例外,具体取决于编译标志.
我还推荐了以下书中的第10章动态链接和加载:链接器和加载器.
操作系统将共享库的代码复制(或更准确地,映射)到内存中.
然后,操作系统为每个进程提供对内存中该一个副本的访问权限.
每个进程可能会"看到"副本处于与另一个不同的内存地址.这由CPU的内存管理单元解决.
它可能比这更复杂,但这基本上是在Linux和其他与Unix相关的操作系统(如Mac OS X)中的工作方式.
| 归档时间: |
|
| 查看次数: |
9076 次 |
| 最近记录: |