C++基礎(chǔ)語法梳理:鏈接裝載庫(一)

內(nèi)存、棧、堆
一般應(yīng)用程序內(nèi)存空間有如下區(qū)域:
棧:由操作系統(tǒng)自動分配釋放,存放函數(shù)的參數(shù)值、局部變量等的值,用于維護(hù)函數(shù)調(diào)用的上下文
堆:一般由程序員分配釋放,若程序員不釋放,程序結(jié)束時可能由操作系統(tǒng)回收,用來容納應(yīng)用程序動態(tài)分配的內(nèi)存區(qū)域
可執(zhí)行文件映像:存儲著可執(zhí)行文件在內(nèi)存中的映像,由裝載器裝載是將可執(zhí)行文件的內(nèi)存讀取或映射到這里
保留區(qū):保留區(qū)并不是一個單一的內(nèi)存區(qū)域,而是對內(nèi)存中受到保護(hù)而禁止訪問的內(nèi)存區(qū)域的總稱,如通常 C 語言講無效指針賦值為 0(NULL),因此 0 地址正常情況下不可能有效的訪問數(shù)據(jù)
棧
棧保存了一個函數(shù)調(diào)用所需要的維護(hù)信息,常被稱為堆棧幀(Stack Frame)或活動記錄(Activate Record),一般包含以下幾方面:
函數(shù)的返回地址和參數(shù)
臨時變量:包括函數(shù)的非靜態(tài)局部變量以及編譯器自動生成的其他臨時變量
保存上下文:包括函數(shù)調(diào)用前后需要保持不變的寄存器
堆
堆分配算法:
空閑鏈表(Free List)
位圖(Bitmap)
對象池
“段錯誤(segment fault)” 或 “非法操作,該內(nèi)存地址不能 read/write”
典型的非法指針解引用造成的錯誤。當(dāng)指針指向一個不允許讀寫的內(nèi)存地址,而程序卻試圖利用指針來讀或?qū)懺摰刂窌r,會出現(xiàn)這個錯誤。
普遍原因:
將指針初始化為 NULL,之后沒有給它一個合理的值就開始使用指針
沒用初始化棧中的指針,指針的值一般會是隨機(jī)數(shù),之后就直接開始使用指針
編譯鏈接
各平臺文件格式

編譯鏈接過程
(1)預(yù)編譯(預(yù)編譯器處理如?#include、#define?等預(yù)編譯指令,生成?.i?或?.ii?文件)
(2)編譯(編譯器進(jìn)行詞法分析、語法分析、語義分析、中間代碼生成、目標(biāo)代碼生成、優(yōu)化,生成?.s?文件)
(3)匯編(匯編器把匯編碼翻譯成機(jī)器碼,生成?.o?文件)
(4)鏈接(連接器進(jìn)行地址和空間分配、符號決議、重定位,生成?.out?文件)
現(xiàn)在版本 GCC 把預(yù)編譯和編譯合成一步,預(yù)編譯編譯程序 cc1、匯編器 as、連接器 ld
MSVC 編譯環(huán)境,編譯器 cl、連接器 link、可執(zhí)行文件查看器 dumpbin
目標(biāo)文件
編譯器編譯源代碼后生成的文件叫做目標(biāo)文件。目標(biāo)文件從結(jié)構(gòu)上講,它是已經(jīng)編譯后的可執(zhí)行文件格式,只是還沒有經(jīng)過鏈接的過程,其中可能有些符號或有些地址還沒有被調(diào)整。
可執(zhí)行文件(Windows 的?.exe?和 Linux 的?ELF)、動態(tài)鏈接庫(Windows 的?.dll?和 Linux 的?.so)、靜態(tài)鏈接庫(Windows 的?.lib?和 Linux 的?.a)都是按照可執(zhí)行文件格式存儲(Windows 按照 PE-COFF,Linux 按照 ELF)
目標(biāo)文件格式
Windows 的 PE(Portable Executable),或稱為 PE-COFF,.obj?格式
Linux 的 ELF(Executable Linkable Format),.o?格式
Intel/Microsoft 的 OMF(Object Module Format)
Unix 的?a.out?格式
MS-DOS 的?.COM?格式
PE 和 ELF 都是 COFF(Common File Format)的變種
目標(biāo)文件存儲結(jié)構(gòu)

鏈接的接口————符號
在鏈接中,目標(biāo)文件之間相互拼合實際上是目標(biāo)文件之間對地址的引用,即對函數(shù)和變量的地址的引用。我們將函數(shù)和變量統(tǒng)稱為符號(Symbol),函數(shù)名或變量名就是符號名(Symbol Name)。
如下符號表(Symbol Table):

今天的分享就到這里了,大家要好好學(xué)C++喲~
寫在最后:對于準(zhǔn)備學(xué)習(xí)C/C++編程的小伙伴,如果你想更好的提升你的編程核心能力(內(nèi)功)不妨從現(xiàn)在開始!
微信公眾號:C語言編程學(xué)習(xí)基地
整理分享(多年學(xué)習(xí)的源碼、項目實戰(zhàn)視頻、項目筆記,基礎(chǔ)入門教程)
歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長比自己琢磨更快哦!
