簡體   English   中英

了解 GOT(全局偏移表)和 PLT?

[英]Understanding GOT (Global Offset Table) and PLT?

在寫這個問題之前,我想強調一下,我自己做了幾個星期的研究,閱讀了數十篇文章,但這個問題仍然沒有解決,我得到的解釋根本沒有意義(也許是因為我是連接世界的新手). 所以我希望有人能提供簡單但非常詳細的答案。

我知道 GOT(全局偏移表)幫助我們解析動態鏈接中從另一個引用的全局符號。 另外我讀到:“每個共享庫都有自己的 GOT”

  1. 但這是有問題的,如果 2 個程序使用同一個共享庫怎么辦? 兩者都將具有相同的全局變量值,但事實並非如此。

  2. 至於我的主要問題:如果我不想使用惰性綁定那么為什么我們根本需要 PLT,為什么不使用普通的 GOT 作為變量呢?

(2) - 這正是gcc -fno-plt所做的; 使用引用普通 GOT 條目的call puts@gotpcrel(%rip)而不是 PLT stubs 更新的 GOT 部分
請參閱x86_64:是否可以“內嵌替換”PLT/GOT 引用?


(1) “每個共享庫都有自己的 GOT ”是指每個進程都有一個 GOT。 這並不是說共享 memory 中的庫只有一個 GOT,每個進程都使用庫映射。

請記住,類 Unix 操作系統(與所有現代主流操作系統一樣)使用虛擬 memory 將進程彼此隔離,因此通常不用說每個進程都有自己獨立的讀/寫數據副本。

當然,像errnoenviron這樣的全局變量不會在使用同一個庫的進程之間共享,這會破壞事情,因此您可以排除這種解釋。 (如果你strace /bin/ls也不是動態鏈接在做什么)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM