linux共享庫鏈接過程
阿新 • • 發佈:2018-03-07
綁定 ack div n) eight 定義 ati 過程 庫文件
2.1.1 重定位 libc.so 的文本和數據到某個存儲器段。
延遲綁定(lazy binding)
}
一 與靜態庫鏈接
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共享庫鏈接過程