linux共享庫鏈接過程


一 與靜態庫鏈接 

1 符號解析(symbol resolution)

將符號的引用與定義聯系在一起。
#引用信息和定義信息在哪兒,怎么聯系在一起的
  1)內部符號解析-編譯器

  2)外部符號解析-連接器

  

與靜態庫鏈接:
    鏈接器維護三個集合(E:可執行文件集合(U:未解析的符號集合(D:已定義的符號集合對於每一個輸入的目標文件,通過里面的符號引用與定義信息來修改U、D中的值。對於庫文件,若庫中的文件成員m中含有對之前 U 中未解析符號的定義,則將m類似目標文件執行操作,直到U、D不再發生變化(如何判斷),則將不包含在E中的目標文件舍棄。鏈接器完成對輸入文件的掃描后,如果U非空則觸發符號未定義錯誤。所以輸入文件的順序尤為重要。

 2 重定位 (relocation)

 2.1 重定位節和符號定義

  

2.2 重定位節中的符號引用

  

二 與動態庫鏈接 

2.0 拷貝重定位和符號表信息

#不拷貝代碼和數據節

2.1 重定位

2.1.1 重定位 libc.so 的文本和數據到某個存儲器段。
2.1.2 重定位 p2 中所有對由 libc.so 定義的符號和引用。

加載時綁定:

調用時綁定:【為了效率】

  延遲綁定技術:
  第一次調用:引用 -> PLT -> GOT -> PLT -> linker(關鍵的延遲綁定代碼, 回填地址至GOT表中)
  之后調用: 引用-> PLT -> GOT -> address

 =============================================================

深入理解計算機系統

延遲綁定(lazy binding)
GOT(globle offset table)
PLT(procedure linkage table)

符號表 {

  每個可重定位目標文件都有一個符號表,一般的(1本模塊全局符號(2本模塊函數(3引用的其他模塊的全局符號(4非全局符號 會生成符號信息。

  符號表數據結構:

  

重定位表{

  重定位表數據結構:

  

 }

 linker & loader

連接器符號表條目{
  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM