在寫這個問題之前,我想強調一下,我對Weeks進行了自己的研究,閱讀了數十篇文章,但仍然沒有解決這個問題,而且我得到的解釋根本沒有意義(也許是因為我是鏈接世界的新手)。所以我希望有人可以提供簡單但非常詳細的答案。
我知道 GOT(全域偏移表)幫助我們決議動態鏈接中從另一個參考的全域符號。另外我讀到:“每個共享庫都有自己的 GOT”
但這是有問題的,如果 2 個程式使用相同的共享庫怎么辦?兩者都將具有相同的全域變數值,這不應該是這種情況。
至于我的主要問題:如果我不想使用延遲系結,那么為什么我們根本需要 PLT,為什么不像使用變數一樣使用普通的 GOT?
uj5u.com熱心網友回復:
(2) - 這正是gcc -fno-plt它所做的;using call puts@gotpcrel(%rip)which 參考正常的 GOT 條目,而不是由 PLT 存根更新的 GOT 部分。
請參閱x86_64:是否可以“在線替換”PLT/GOT 參考?
(1) “每個共享庫都有自己的 GOT ”,而不是每個行程都有一個。這并不是說共享記憶體中的庫只有一個 GOT,每個行程使用庫映射。
請記住,類 Unix 作業系統(與所有現代主流作業系統一樣)使用虛擬記憶體將行程彼此隔離,因此通常不用說,每個行程都有自己獨立的讀/寫資料副本。
當然,全域變數在使用同一庫的行程之間共享errno或environ不共享,這會破壞事情,因此您可以排除這種解釋。(以及不是動態鏈接在做什么,如果你strace /bin/ls)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/313734.html
上一篇:匯編代碼暫存器的范圍是什么?
