【发布时间】:2019-04-02 01:47:22
【问题描述】:
我一直在努力更好地了解共享库的工作原理,但我无法解决两件事。
1- 每个进程都有自己的虚拟内存空间和页表,所以如果一个共享库被加载到一个进程的虚拟内存空间中,那么第二个进程如何访问该共享库,因为它不在其内存空间中?
2- 我知道只有文本部分被共享而全局数据不被共享,这怎么可能?我的理解是,对全局变量的每个引用都是通过Global Offset Table(简称 GOT)完成的。所以,如果我有这行代码x = glob,那么这将大致等于汇编中的mov eax,DWORD PTR [ecx-0x10],其中ecx 用作GOT 的基值。但如果是这种情况,那么很明显,无论哪个进程调用该行,它总是会访问同一个全局变量,其地址位于 GOT 中的偏移量 0x10。那么,如果两个进程使用引用相同 GOT 条目的相同文本部分,那么它们如何拥有不同的全局变量副本呢?
【问题讨论】:
标签: unix shared-libraries dynamic-linking position-independent-code got