要使全局偏移表工作,GOT必须位于文本段的固定位置。现在假设一个程序需要一个共享库。还假设共享库已经被OS加载用于某个其他进程。现在对于我们的程序来说,由于共享库的文本部分已经加载,所以它只需要加载数据段。共享库文本部分被映射回我们进程的虚拟地址。但是,如果在我们共享库的虚拟地址的固定偏移处已经有一些数据/文本或其他东西,那该怎么办呢?动态链接器如何解决这种冲突?一种方法是将R_386_GOTPC留在文本部分,直到加载时,让动态链接器将其更改为新的偏移量。在实践中是这样做的吗?
发布于 2017-07-17 15:25:47
在GNU上,即使是相同的DSO也被映射到不同的进程中的不同地址。它们之间根本不共享任何数据。这意味着GOT只是私有数据(如.data
),并在加载时使用正确的地址(存根或BIND_NOW
的正确函数地址)进行初始化。
(这假设prelink
未在使用中,这在某种程度上是有问题的。)
https://stackoverflow.com/questions/44928144
复制