(八)從源文件到可執(zhí)行文件

機(jī)器運行的是本地代碼(Native Code)

用某種編程語言編寫出來的程序是源代碼,保存源代碼的文件是源文件裕便。源文件只是文本文件寂嘉,并不能直接運行,因為CPU只能運行本地代碼(機(jī)器語言代碼)侄刽。因此,源代碼必須被轉(zhuǎn)換為本地代碼拓挥。

本地代碼里有什么唠梨?

Window中.EXE文件的程序內(nèi)容袋励,就是本地代碼侥啤。只有機(jī)器能夠理解,人不能理解茬故。


將它DUMP一下盖灸,即每字節(jié)以2位16進(jìn)制(2進(jìn)制和16進(jìn)制的轉(zhuǎn)換規(guī)則中,二進(jìn)制中每4位可以轉(zhuǎn)換為十六進(jìn)制中1位)的形式表現(xiàn)磺芭,就可以發(fā)現(xiàn)赁炎,本地代碼其實是數(shù)值的集合。每一個數(shù)值都代表了一個命令或一個數(shù)據(jù)钾腺。

從源文件到可執(zhí)行文件的過程

第一步:轉(zhuǎn)換源代碼:編譯器

編譯器:將編程語言編寫的源代碼轉(zhuǎn)換為本地代碼的程序徙垫。
編譯完成的程序為 .obj 目標(biāo)文件 ,內(nèi)容是本地代碼放棒。但是還不能夠運行姻报。

轉(zhuǎn)換每種高級編程語言都需要其專有的編譯器,例如C語言的C編譯器间螟。
同種編程語言在不同CPU下的編譯器也不同吴旋。
編譯器也是程序损肛,因此也需要適合它的運行環(huán)境。
因此荣瑟,確定一個編譯器的種類治拿,需要確定哪種編程語言+哪種CPU+哪種運行環(huán)境。而實際上購買和下載時笆焰,通常指需要確定編譯器產(chǎn)品名稱+版本號即可劫谅。


第二步:生成.EXE文件與啟動:鏈接器

經(jīng)過編譯器的編譯,源文件已經(jīng)被轉(zhuǎn)換成了.obj 目標(biāo)文件嚷掠。
鏈接:將多個目標(biāo)文件結(jié)合起來同波,生成一個.EXE 可執(zhí)行文件。
鏈接器:運行鏈接的程序叠国。

庫文件和標(biāo)準(zhǔn)函數(shù)

庫文件未檩,即.lib文件,是指將多個目標(biāo)文件集成保存在一個文件里的形式粟焊。
標(biāo)準(zhǔn)函數(shù):在庫文件中收錄的函數(shù)冤狡。在程序中,不通過源代碼另行編寫项棠,而通過庫文件提供的函數(shù)悲雳。
如果主程序中使用了標(biāo)準(zhǔn)函數(shù),在運行鏈接程序時香追,鏈接器就需要指定收錄它的庫文件合瓢,將庫文件中需要的.obj目標(biāo)文件(包含此標(biāo)準(zhǔn)函數(shù))抽取出來,與其他目標(biāo)文件共同生成一個.EXE可執(zhí)行文件透典。

啟動

在鏈接時晴楔,必須鏈接一個特殊的目標(biāo)文件,它記述了同所有程序起始位置相結(jié)合的處理內(nèi)容峭咒,成為程序的啟動税弃。

DLL文件和導(dǎo)入庫

靜態(tài)鏈接庫:

靜態(tài)鏈接庫中包含了目標(biāo)文件的實體,包含了主程序中使用的標(biāo)準(zhǔn)函數(shù)的具體代碼凑队,在鏈接時则果,直接與目標(biāo)文件結(jié)合。

導(dǎo)入庫(.lib)

導(dǎo)入庫文件中漩氨,不包含目標(biāo)文件的實體西壮,而只包含了:1.被調(diào)用的標(biāo)準(zhǔn)函數(shù)位于哪個DLL文件中;2.這個DLL文件所在的文件夾信息。
在鏈接時叫惊,只提供此標(biāo)準(zhǔn)函數(shù)的被調(diào)用信息參與鏈接款青。

動態(tài)鏈接庫(.dll)

動態(tài)鏈接庫中包含了目標(biāo)文件的實體在程序運行時赋访,動態(tài)地與.EXE可執(zhí)行文件結(jié)合可都。

總結(jié)


.EXE文件的運行機(jī)制

EXE作為單獨的文件被儲存在磁盤中缓待,被雙擊打開時,被加載到內(nèi)存中渠牲,由CPU運行旋炒。

EXE程序中的變量和函數(shù),是怎樣確定在內(nèi)存中的地址的签杈?
EXE文件給變量和函數(shù)分配了虛擬的內(nèi)存地址瘫镇。鏈接時,鏈接器在EXE文件的開頭追加了轉(zhuǎn)換內(nèi)存地址的必要信息答姥。程序運行時铣除,根據(jù)這個信息(稱為再配置信息),將虛擬內(nèi)存地址轉(zhuǎn)換為真實內(nèi)存地址鹦付。
方式:EXE程序給變量和函數(shù)分配的虛擬內(nèi)存地址尚粘,作為真實內(nèi)存地址的基點存在。鏈接器追加的再配置信息敲长,作為相對地址存在郎嫁,即相對基點地址的偏移量。
真實內(nèi)存地址=基點地址+相對地址祈噪。

堆和棧

EXE文件的內(nèi)容分為再配置信息泽铛、函數(shù)組合變量組。
加載到內(nèi)存后辑鲤,還會再生成兩個組:堆和棧盔腔。

棧:儲存函數(shù)參數(shù)和局部變量的內(nèi)存區(qū)域。
堆:儲存程序運行時任意對象和數(shù)據(jù)的內(nèi)存區(qū)域月褥。
EXE文件中不存在堆和棧弛随,堆和棧是向內(nèi)存申請的空間。
因此吓坚,內(nèi)存中的文件的構(gòu)成為:用于變量的內(nèi)存空間+用于函數(shù)的內(nèi)存空間+用于堆的內(nèi)存空間+用于棧的內(nèi)存空間撵幽。

內(nèi)存泄漏

棧:對數(shù)據(jù)進(jìn)行存儲和清理的代碼,由編譯器自動生成礁击。
堆:對堆的空間的申請分配和釋放,由程序員自己編寫代碼實現(xiàn)逗载。C語言中哆窿,申請分配:malloc()函數(shù),釋放:free()函數(shù)厉斟;C++語言中挚躯,申請分配:new運算符,釋放:delete運算符擦秽。
如果沒有明確釋放申請分配的內(nèi)存码荔,就可能造成內(nèi)存泄漏(memory leak)漩勤。

一些Q&A



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市缩搅,隨后出現(xiàn)的幾起案子越败,更是在濱河造成了極大的恐慌,老刑警劉巖硼瓣,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件究飞,死亡現(xiàn)場離奇詭異,居然都是意外死亡堂鲤,警方通過查閱死者的電腦和手機(jī)亿傅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瘟栖,“玉大人葵擎,你說我怎么就攤上這事“胗矗” “怎么了殖氏?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長磷瘤。 經(jīng)常有香客問我桨吊,道長,這世上最難降的妖魔是什么缅茉? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任嘴脾,我火速辦了婚禮,結(jié)果婚禮上蔬墩,老公的妹妹穿的比我還像新娘译打。我一直安慰自己,他們只是感情好拇颅,可當(dāng)我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布奏司。 她就那樣靜靜地躺著,像睡著了一般樟插。 火紅的嫁衣襯著肌膚如雪韵洋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天黄锤,我揣著相機(jī)與錄音搪缨,去河邊找鬼。 笑死鸵熟,一個胖子當(dāng)著我的面吹牛副编,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播流强,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼痹届,長吁一口氣:“原來是場噩夢啊……” “哼呻待!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起队腐,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蚕捉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后香到,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鱼冀,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年悠就,在試婚紗的時候發(fā)現(xiàn)自己被綠了千绪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡梗脾,死狀恐怖荸型,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情炸茧,我是刑警寧澤瑞妇,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站梭冠,受9級特大地震影響辕狰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜控漠,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一蔓倍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盐捷,春花似錦偶翅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至滞诺,卻和暖如春形导,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背铭段。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工骤宣, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人序愚。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像等限,于是被迫代替她去往敵國和親爸吮。 傳聞我的和親對象是個殘疾皇子芬膝,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容