加载已加载的共享库的数据段

时间:2017-07-05 13:49:47

标签: gcc ld elf

要使全局偏移表起作用,GOT必须位于文本段的固定位置。现在假设一个程序需要一个共享库。还假设操作系统已经为某些其他进程加载了共享库。现在对于我们的程序,由于共享库的文本部分已经加载,它只需要加载数据段。共享库文本部分映射回我们进程的虚拟地址。但是,如果已经存在一些数据/文本或者与共享库的虚拟地址相对应的固定偏移量,那该怎么办呢?动态链接器如何解决这种冲突?一种方法是将R_386_GOTPC保留在文本部分中直到加载时间,并让动态链接器将其更改为新的偏移量。这是在实践中如何完成的。

1 个答案:

答案 0 :(得分:0)

在GNU上,即使相同的DSO也映射到不同进程的不同地址。它们之间根本没有共享数据。这意味着GOT只是私有数据(如.data),并在加载时使用正确的地址(存根或具有BIND_NOW的正确函数地址)进行初始化。

(这假定prelink未被使用,无论如何都有所破坏。)