2017-07-05 44 views
0

要使全局偏移量表正常工作,GOT必須位於文本段的固定位置。現在假設一個程序需要一個共享庫。還假定共享庫已被OS加載用於其他進程。現在對於我們的程序,由於共享庫的文本部分已經加載,所以只需要加載數據段。共享庫文本部分被映射回我們進程的虛擬地址。但是如果在我們的共享庫的虛擬地址的固定偏移處已經存在一些數據/文本或者其他什麼東西呢?動態鏈接器如何解決衝突?一種方法是將R_386_GOTPC保留在文本部分中直到加載時間,並讓動態鏈接器將其更改爲新的偏移量。這是如何在實踐中完成的?加載已加載的共享庫的數據段

回答

0

在GNU上,即使同一個DSO映射到不同進程的不同地址。他們之間根本沒有數據共享。這意味着GOT只是私有數據(如.data),並且在加載時使用正確的地址進行初始化(或者存根或者使用BIND_NOW的正確函數地址)。

(假定prelink未使用,無論如何都有些中斷。)