Elf

ELF 符號可見度級別之間有什麼區別?

  • October 2, 2018

NASM 文件關於全球指令的擴展”elf

或者,您可以控制符號的 ELF 可見性。只需添加可見性關鍵字之一:defaultinternalhiddenprotected。預設default當然是。

這些在哪裡定義?以及如何ld使用它們?我看到C++ 中經常提到的訪問級別,包括protectedpublicprivate,但我不知道這是否是 ELF 所引用的?

我的案例是 C 和彙編,所以如果你可以使它與這兩種語言和連結器相關,加分。

NASM 來源看來,這些似乎與Oracle “Linker and Libraries Guide”中的文件相對應,這些似乎對應於STV_DEFAULTSTV_INTERNALSTV_HIDDENSTV_PROTECTED.

甲骨文這樣說:

  • STV_DEFAULT``STV_DEFAULT具有屬性的符號的可見性由符號的綁定類型指定。也就是說,全域符號和弱符號在其定義組件、執行檔或共享對象之外是可見的。本地符號被隱藏。全域符號和弱符號也可以被搶占,也就是說,它們可以插入另一個組件中的同名定義。
  • STV_PROTECTED如果目前組件中定義的符號在其他組件中可見但不能被搶占,則它會受到保護。從定義組件中對此類符號的任何引用都必須解析為該組件中的定義,即使在另一個組件中存在將通過預設規則插入的定義。STB_LOCAL具有綁定的符號將不具有STV_PROTECTED可見性。
  • STV_HIDDEN如果目前組件中定義的符號對其他組件不可見,則其名稱將被隱藏。這樣的符號必然受到保護。該屬性用於控制組件的外部介面。如果將其地址傳遞到外部,則由此類符號命名的對象仍可能從另一個組件引用。

STB_LOCAL當可重定位對象包含在執行檔或共享對像中時,連結編輯器會刪除可重定位對像中包含的隱藏符號或將其轉換為綁定。

  • STV_INTERNAL此可見性屬性目前是保留的。

至於對 C 和彙編的影響,Oracle 文件繼續說

在連結編輯期間,任何可見性屬性都不會影響執行檔或共享對像中符號的解析。這種解析度由綁定類型控制。一旦連結編輯器選擇了它的解析度,這些屬性就會提出兩個要求。這兩個要求都基於這樣一個事實,即被連結的程式碼中的引用可能已經過優化以利用屬性。

  • 首先,當應用於符號引用時,所有非預設可見性屬性意味著必須在目前執行檔或共享對像中提供滿足該引用的定義。如果這種類型的符號引用在被連結的組件中沒有定義,則該引用必須具有STB_WEAK綁定並被解析為零。
  • 其次,如果對名稱的任何引用或定義是具有非預設可見性屬性的符號,則可見性屬性必須傳播到連結對像中的解析符號。如果為符號的不同引用或定義指定了不同的可見性屬性,則必須將最具約束性的可見性屬性傳播到連結對像中的解析符號。屬性按約束從小到大排序,分別STV_PROTECTEDSTV_HIDDENSTV_INTERNAL

也可以看看

引用自:https://unix.stackexchange.com/questions/472660