簡體   English   中英

鏈接器如何產生庫? 該庫的內容是什么?

[英]How does a linker produce a library? What are the contents of that library?

引用此答案: https : //stackoverflow.com/a/6264256/5324086 ,我發現鏈接器具有的功能甚至不僅僅是管理目標文件符號的絕對地址。

鏈接程序生成的庫包含什么? 除了...說一個C標准庫以外,還有什么嗎?

為什么鏈接器甚至需要產生一個庫?

確切的詳細信息取決於庫的類型(您可以搜索共享的庫格式),但是基本組件將包括編譯后的代碼以及一個符號表,該符號表告訴鏈接器哪個地址對應於每個名稱。 請注意,這與目標文件非常相似。 靜態庫基本上是目標文件的存檔,編譯器以類似的方式鏈接它們。 使用動態庫,OS可以在每次加載程序時進行查找,然后鏈接符號。 它們在每個程序的地址空間中通常不會具有相同的絕對地址,因此這些地址將相對於OS加載庫的位置。

C標准庫(Windows上的MSVC運行時)是一個庫示例。

靜態庫只是對象文件的集合。 您可以將它們視為包含所有相關的.a文件的tar文件(或者,在Windows上,可以將其視為包含obj文件的zip文件)。 此處不涉及鏈接器的鏈接部分(實際上,傳統上Unix系統上的靜態庫是由ar實用程序完成的,而ar實用程序與tar有關)。 它們在編譯時已完全解決,它們僅用作避免重新構建時間長,構建時間長或具有復雜構建過程的東西的方法。

動態庫是另一種野獸。 它們是完全成熟的可執行文件,可以由其他進程加載,因此出於與普通可執行文件相同的原因,需要常規鏈接程序。 它們將導出一個完整的符號表,而不是僅提供一個入口點,加載器(或“運行時鏈接程序”)將使用該表來允許主機程序定位所需的過程。 通常,它們還包含重定位信息,以允許在目標地址空間中的任何地址進行加載(或者出於相同的原因,它們也被編譯為與位置無關的代碼)。

暫無
暫無

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

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