2012-07-04 70 views

回答

1

這意味着符號的可見性被隱藏:https://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/CppRuntimeEnv/Articles/SymbolVisibility.html

原因改變符號的可見性包括:符號碰撞

  • 較少風險。
  • 較小的二進制文件。
  • 由於動態鏈接器不需要處理儘可能多的符號,因此縮短了啓動時間。
  • 更高效的代碼的機會,因爲編譯器知道一個符號不能通過LD_PRELOAD類型的系統重寫。
  • 防止第三方軟件調用未記錄的API。

查看http://www.gnu.org/software/gnulib/manual/html_node/Exported-Symbols-of-Shared-Libraries.html瞭解更多信息。

+0

我使用的庫靜態鏈接我的可執行文件。問題是我有兩個不同的庫中定義的上述符號,都是隱藏的。鏈接由於重複的符號而失敗。當我正確理解你時,應該不會發生這種情況嗎? – MBober

+3

@MBober:不,鏈接器在該方案中產生錯誤是正確的。請記住,靜態庫基本上是對象文件的存檔,當靜態庫鏈接到鏈接器時,它們都會輸入到鏈接器中。符號可見性會影響鏈接器(可執行文件或動態庫)的輸出,但是您仍然會有鏈接器如果兩個或多個目標文件定義相同的符號,則會出現問題 –

1

解釋visibility support(對於GCC)的鏈接

從鏈接:

  • 這非常顯着地提高了您的DSO(動態共享對象)的加載時間。例如,一個經過測試的巨大的基於C++模板的庫(TnFOX Boost.Python綁定庫)現在可以在8秒內加載而不是超過6分鐘!

  • 它可以讓優化器產生更好的代碼。可以完全避免PLT間接尋址(當函數調用或變量訪問必須通過全局偏移表(例如PIC代碼)查找時),因此可以大大避免現代處理器上的流水線延遲,從而使代碼更快。此外,當大多數符號在本地綁定時,它們可以完全通過整個DSO完全消除(移除)。這給予了更大的自由度,特別是對於不再需要在「以防萬一」時保持入口點的內聯。

  • 它可以將DSO的大小減少5-20%。 ELF導出的符號表格式相當空間大小,給出了完整的模糊符號名稱,其中大量模板的使用可以平均大約1000字節。 C++模板發佈了大量的符號,典型的C++庫可以輕鬆地超過30,000個大約5-6Mb的符號!因此,如果你切掉60-80%的不必要的符號,你的DSO可能會減小兆字節!

  • 符號碰撞機率較低。兩個圖書館在內部使用相同符號表示不同事物的舊禍終於落後於我們。哈利路亞!

儘管上面引述的庫是一個極端的情況下,新的可見性降低支持導出的符號表從> 200000個符號至小於18,000。一些21Mb也被打破了二進制大小!

一個usage sample and also potential pitfall使用公開程度屬性時

相關問題