1. 程式人生 > >linux共享庫鏈接過程

linux共享庫鏈接過程

綁定 ack div n) eight 定義 ati 過程 庫文件

技術分享圖片技術分享圖片

一 與靜態庫鏈接

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

連接器符號表條目{   技術分享圖片
技術分享圖片
}

linux共享庫鏈接過程