深入理解计算机操作系统:链接
文章目錄
- 鏈接器的由來:
- 鏈接過程的本質(zhì):
- 目標(biāo)文件的兩種視圖
- 可重定位文件概述
- ELF頭和節(jié)頭表
- 可執(zhí)行文件概述
- 程序頭表和存儲器印象
- 符號和符號表的基本概念
- 全局符號的強弱特性
- 多重符號定義舉例
- 精華PPT1
- 靜態(tài)共享庫的創(chuàng)建
- 精華PPT
- 符號解析過程
- 精華PPT
- 精華PPT 2 鏈接器的順序很重要
- 鏈接順序問題
- 重定位的基本概念
- PC相對地址重定位
- 絕對地址重定位
- 符合重定位舉例
- 可執(zhí)行文件的加載
- 共享庫和動態(tài)鏈接庫
- 模塊內(nèi)引用和模塊間數(shù)據(jù)引用
- 模塊間的調(diào)用或跳轉(zhuǎn)
鏈接器的由來:
將跳轉(zhuǎn)指令由符號表示,通過符號來確定程序執(zhí)行代碼的順序這個就是鏈接的基礎(chǔ)思想。
鏈接操作步驟:
符號解析 (確定符號代表著哪一段程序)+ 重定位 (把這些程序重新合成一個可執(zhí)行文件,把片段放到可執(zhí)行文件的里面的位置就是重定位,實際上是虛擬地址)
鏈接過程的本質(zhì):
將編譯后的.o文件首先鏈接成在虛擬地址下的可執(zhí)行文件,然后這個文件加載到虛擬內(nèi)存中,由程序頭表來記錄程序在虛擬內(nèi)存中的位置。
目標(biāo)文件的兩種視圖
可重定位目標(biāo)文件
可執(zhí)行目標(biāo)文件
共享的目標(biāo)文件 就是dll
目標(biāo)文件的格式
可重定位文件概述
小結(jié):
bss節(jié)不占磁盤空間的原因是只需要在節(jié)頭表說明在內(nèi)存中需要給bss節(jié)留有一個內(nèi)存空間大小就可以了
ELF頭和節(jié)頭表
小結(jié):
e_type:小端 大端 的意思是在內(nèi)存中存儲數(shù)據(jù)從小地址到高地址存儲的數(shù)據(jù)是從小到大,還是從大到小,這個在計算機網(wǎng)絡(luò)中也很重要。
大端模式,是指數(shù)據(jù)的高字節(jié)保存在內(nèi)存的低地址中,而數(shù)據(jù)的低字節(jié)保存在內(nèi)存的高地址中,這樣的存儲模式有點兒類似于把數(shù)據(jù)當(dāng)作字符串順序處理:地址由小向大增加,而數(shù)據(jù)從高位往低位放;這和我們的閱讀習(xí)慣一致。
小端模式,是指數(shù)據(jù)的高字節(jié)保存在內(nèi)存的高地址中,而數(shù)據(jù)的低字節(jié)保存在內(nèi)存的低地址中,這種存儲模式將地址的高低和數(shù)據(jù)位權(quán)有效地結(jié)合起來,高地址部分權(quán)值高,低地址部分權(quán)值低。
e_machine: 表示按照32位還是64位解釋程序
讀取ELF頭 ,用readelf - h ,讀取ELF節(jié)頭表用readelf - s
節(jié)頭表中 sh_addr 表示虛擬地址 ,若是可重定位目標(biāo)文件則為0
可執(zhí)行文件概述
程序頭表和存儲器印象
小結(jié)
BSS不占磁盤空間,但是占虛擬內(nèi)存空間
符號和符號表的基本概念
小結(jié)
static定義的符號只能在本模塊使用,是一個局部符號,函數(shù)內(nèi)定義的變量不是一個符號。
全局符號的強弱特性
多重符號定義舉例
精華PPT1
小結(jié):
1、強弱定義符合的解析對于全局變量的賦值有著重要影響,考慮不周全的全局變量容易被意外賦值,考慮上面y z之的例子
2、多重符號定義,若強弱符號類型不一致,在編譯時由于機器不知道類型不同,所以按照局部的自己的聲明百編譯,但是到了執(zhí)行時,由于不同的數(shù)據(jù)類型占有的實際內(nèi)存大小不一樣,就會導(dǎo)致數(shù)據(jù)放入到錯誤的內(nèi)存地址中,從而引發(fā)意外情況。
靜態(tài)共享庫的創(chuàng)建
精華PPT
gcc - c myproc1.c myproc2.c 將兩個.c文件生成兩個.o文件 ar rcs mylib.a myproc1.o myproc2.o 將兩個·.o文件合并到mylib.a的靜態(tài)共享庫文件中 gcc - c main.c gcc -static -o myproc main.o ./mylib.c 將main.o 文件鏈接 mylib.c的庫文件 生成可執(zhí)行文件 myproc符號解析過程
精華PPT
使用lib鏈接庫不會鏈接沒有使用的模塊
精華PPT 2 鏈接器的順序很重要
鏈接順序問題
重定位的基本概念
PC相對地址重定位
init 為4的原因:call指令的位置與當(dāng)前的位置相差4
絕對地址重定位
符合重定位舉例
可執(zhí)行文件的加載
共享庫和動態(tài)鏈接庫
模塊內(nèi)引用和模塊間數(shù)據(jù)引用
模塊間的調(diào)用或跳轉(zhuǎn)
總結(jié)
以上是生活随笔為你收集整理的深入理解计算机操作系统:链接的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tcp ip socket
- 下一篇: 深入理解计算机操作系统:链接笔记