鏈接
鏈接是將各種代碼和數(shù)據(jù)片段收集并組合成為一個(gè)單一文件的過程可免,其可以發(fā)生在:
編譯時(shí)
加載時(shí)
運(yùn)行時(shí)
在現(xiàn)代系統(tǒng)中烦周,鏈接是由鏈接器
自動(dòng)執(zhí)行的
靜態(tài)鏈接
以一組可重定位目標(biāo)文件和命令行參數(shù)作為輸入,生成一個(gè)完全鏈接的抬伺、可以加載和運(yùn)行的可執(zhí)行目標(biāo)文件作為輸出
靜態(tài)連接器
通過兩個(gè)任務(wù)完成可執(zhí)行文件的構(gòu)造
- 符號(hào)解析:將每個(gè)符號(hào)的引用正好和每一個(gè)符號(hào)定義關(guān)聯(lián)起來
- 重定位:通過把每個(gè)符號(hào)定義與一個(gè)內(nèi)存位置關(guān)聯(lián)起來螟够,從而重定位這些節(jié),然后修改所有對(duì)這些符號(hào)的引用,使得它們指向內(nèi)存位置
目標(biāo)文件
包含三種形式:
- 可重定位目標(biāo)文件:包含二進(jìn)制代碼和數(shù)據(jù)妓笙,其形式可以在編譯時(shí)與其他可重定位文件合并起來若河,創(chuàng)建一個(gè)可執(zhí)行目標(biāo)文件
- 可執(zhí)行目標(biāo)文件:包含二進(jìn)制代碼和數(shù)據(jù),其形式可以被直接復(fù)制到內(nèi)存并執(zhí)行
- 共享目標(biāo)文件:一種特殊類型的重定位目標(biāo)文件寞宫,可以在加載或者運(yùn)行時(shí)被動(dòng)態(tài)的加載進(jìn)內(nèi)存并連接
可重定位目標(biāo)文件
一個(gè)典型的ELF可重定位目標(biāo)文件
如下:
- .text:已編譯程序的機(jī)器碼
- .rodata:只讀數(shù)據(jù)
- .data:已初始化的全局和靜態(tài)C變量
- .bss:未初始化的全局和靜態(tài)C變量萧福,以及所有被初始化為0的全局或靜態(tài)變量
- .symtab:符號(hào)表,存放在程序中定義和引用函數(shù)和全局變量的信息
-
.rel.text:一個(gè)
.text
節(jié)中位置的列表辈赋,當(dāng)鏈接器
把這個(gè)目標(biāo)文件和其它文件組合時(shí)统锤,需要修改這些位置 - .rel.data:被模塊引用或定義的所有全局變量的重定位信息
- .debug:調(diào)試符號(hào)表
-
.line:原始C源程序中的行號(hào)和
.text
節(jié)中機(jī)器指令之間的映射 - .strtab:字符串表