最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

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

2021-10-28 17:01 作者:C語言編程__Plus  | 我要投稿



內(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í)基地

C語言零基礎(chǔ)入門教程(83集全)

整理分享(多年學(xué)習(xí)的源碼、項目實戰(zhàn)視頻、項目筆記,基礎(chǔ)入門教程)

歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長比自己琢磨更快哦!



C++基礎(chǔ)語法梳理:鏈接裝載庫(一)的評論 (共 條)

分享到微博請遵守國家法律
宣武区| 沅陵县| 百色市| 吴忠市| 全州县| 林口县| 苍溪县| 苏州市| 磐石市| 玉屏| 沁水县| 县级市| 商都县| 岑溪市| 屏东市| 鹿邑县| 海伦市| 扎鲁特旗| 繁峙县| 五常市| 永靖县| 彰武县| 连云港市| 永泰县| 房山区| 长乐市| 石首市| 甘孜县| 黄龙县| 乌鲁木齐县| 巴林右旗| 米脂县| 扎兰屯市| 井冈山市| 贵南县| 江孜县| 老河口市| 海晏县| 贵南县| 德清县| 益阳市|