簡體   English   中英

流程鏈接表和全局偏移表

[英]Process Linkage Table and Global Offset Table

我正在閱讀有關PLT(過程鏈接表)和GOT(全局偏移表)的文章 雖然PLT的目的很明確,但我仍然對GOT感到困惑。 從本文中我了解到,只有在共享庫中聲明為extern變量才需要GOT。 對於在共享庫代碼中聲明為static全局變量,則不需要。

我的理解正確嗎,還是我完全忘記了這一點。

也許您的困惑與extern的含義有關。 由於默認鏈接是extern ,所以在函數范圍之外聲明的,沒有static關鍵字的任何變量都是extern

需要GOT的原因是,在生成共享庫時,未知由共享庫代碼訪問的變量的地址。 它取決於加載庫的加載地址(如果定義在庫本身中)或定義變量的第三方代碼(如果定義在其他地方)。 因此,編譯器不會在代碼中插入地址,而是生成代碼以讀取共享庫的GOT,然后在運行時從GOT加載地址。

如果已知該變量是在同一個共享庫中定義的(因為它是static或者因為它使用了hiddenprotected可見性屬性),則可以在生成共享庫文件時固定相對於庫中代碼的地址。 在這種情況下,編譯器將生成代碼以使用程序計數器相對尋址來訪問變量,而不是通過GOT執行查找。 這在運行時和加載時都比較便宜(因為可以在加載時跳過整個符號查找和重定位過程)。

暫無
暫無

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

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