【知其所以然】-對(duì)鏈接的思考
引言:
寫一段程序很容易、也能很容易的得到一個(gè)能正確運(yùn)行的執(zhí)行、學(xué)習(xí)語言很容易,難的是掌握它
不管接觸什么語言,最經(jīng)典的入門例子大概就是“hello world”了。然而,對(duì)于“hello world”背后的東西、當(dāng)時(shí)卻不曾深究。
作為做程序的普通小菜、我仍醉心于基礎(chǔ)和底層的東西。誠然、我也認(rèn)為這些東西很重要。練好“內(nèi)功”、有扎實(shí)的底層基礎(chǔ)才能走的更快更遠(yuǎn)。
知其所以然:承上、今天看了一下關(guān)于編譯過程中鏈接的部分、覺得很有價(jià)值遂分享如下。
由于鏈接器是從編譯器中分割出來的單獨(dú)程序,所以先要對(duì)編譯有一個(gè)基本的認(rèn)識(shí)。
編譯器的基本概念:
簡(jiǎn)單的說,一個(gè)編譯器就是一個(gè)程序,它可以閱讀某一種程序語言編寫的程序,并把改程序翻譯成一個(gè)等價(jià)的用另一種語言編寫的程序。
絕大多數(shù)的編譯器并不是一個(gè)單一的龐大程序,通常由六七個(gè)較小的單獨(dú)的程序組成,這些程序由一個(gè)叫做“編譯器驅(qū)動(dòng)器”的控制程序
來調(diào)用。這些單獨(dú)的程序一般包括:預(yù)處理器,語法和語義檢查器,代碼生成器,優(yōu)化器,匯編程序,鏈接器。(一段程序也正是經(jīng)過上面的那些順序而被編譯的)
鏈接器
由匯編程序產(chǎn)生的目標(biāo)文件并不能馬上執(zhí)行,而是被送入連接器生成可執(zhí)行文件。鏈接器確人main函數(shù)為程序入口點(diǎn),吧符號(hào)引用綁定到內(nèi)存地址,把所有是目標(biāo)文件
組合在一起,再加上庫文件,從而產(chǎn)生可執(zhí)行程序。
用于pc的鏈接機(jī)制和那些更大的系統(tǒng)有明顯區(qū)別,pc連接器只提供幾個(gè)基本的IO服務(wù),就是被稱作BIOS的程序。它們存在于內(nèi)存的固定地點(diǎn),并不是可執(zhí)行文件的一部分。
如果需要其他功能,可以通過庫函數(shù)提供,但編譯器必須吧庫函數(shù)鏈接到每個(gè)可執(zhí)行文件中。也就是每個(gè)可執(zhí)行文件都會(huì)有一個(gè)庫函數(shù)的拷貝。
之前的UNIX系統(tǒng)也是如此,當(dāng)鏈接程序時(shí),程序需要的每個(gè)函數(shù)都拷貝一份到執(zhí)行文件中。這就是可以說已經(jīng)用的不多的鏈接技術(shù):靜態(tài)鏈接
表面上好像順理成章、或許善于思考的你已經(jīng)能想象出這樣做的不妥之處了吧、這里先不說,等看完了動(dòng)態(tài)鏈接就會(huì)豁然開朗的
動(dòng)態(tài)鏈接:
動(dòng)態(tài)鏈接是對(duì)靜態(tài)鏈接的一種優(yōu)化。動(dòng)態(tài)鏈接允許系統(tǒng)提供一個(gè)龐大的函數(shù)集合,可以提供各種各樣的服務(wù)。和靜態(tài)鏈接不同,在程序允許需要函數(shù)的
時(shí)候從系統(tǒng)中取出直接用,而不是和靜態(tài)鏈接一樣把函數(shù)作為可執(zhí)行文件的一部分。目前大多數(shù)情況都會(huì)使用動(dòng)態(tài)鏈接。
如果函數(shù)庫的一份拷貝是可執(zhí)行文件的物理組成部分,那么我們稱為靜態(tài)鏈接。如果可執(zhí)行文件只包含了文件名,讓載入器在運(yùn)行的時(shí)候能從系統(tǒng)中找到
程序需要的函數(shù),那么稱為動(dòng)態(tài)鏈接。
靜態(tài)鏈接的模塊被鏈接編輯并載入可執(zhí)行文件中一邊執(zhí)行。動(dòng)態(tài)鏈接的模塊被編輯后載入(運(yùn)行的時(shí)候不需要鏈接),并在執(zhí)行的時(shí)候鏈接(鏈接調(diào)用的庫函數(shù))一邊運(yùn)行
(運(yùn)行時(shí)候要鏈接所調(diào)用的函數(shù))。(動(dòng)態(tài)鏈接生成的可執(zhí)行文件)執(zhí)行時(shí),在main()函數(shù)被調(diào)用之前,運(yùn)行時(shí)載入器吧共享的數(shù)據(jù)對(duì)象載入到進(jìn)程的地址空間。
外部函數(shù)被調(diào)用之前, 運(yùn)行時(shí)載入器并不解析他們。所以即使鏈接了函數(shù)庫,如果沒有實(shí)際調(diào)用個(gè),也不會(huì)帶來額外開銷。
動(dòng)態(tài)鏈接的優(yōu)點(diǎn):
1.動(dòng)態(tài)鏈接可執(zhí)行文件比同功能的靜態(tài)鏈接文件體積小 。能節(jié)省磁盤空間和虛擬內(nèi)存
2.所有動(dòng)態(tài)鏈接到某個(gè)特定函數(shù)庫 的可執(zhí)行文件在運(yùn)行時(shí)共享該函數(shù)庫的一個(gè)單獨(dú)拷貝。操作系統(tǒng)內(nèi)核保證映射到內(nèi)存中的函數(shù)庫可以被所有他們的進(jìn)程共享。提高了更好的
I/O和交換空間利用率,節(jié)省物理內(nèi)存而提高系統(tǒng)的整體性能。
3.動(dòng)態(tài)鏈接使得函數(shù)庫的版本升級(jí)更為容易。新的函數(shù)庫可隨時(shí)發(fā)布,只要更新到系統(tǒng)中就可而不用改動(dòng)程序。
暫時(shí)就寫這些吧、歡迎補(bǔ)充、、、
不足之處還望指正。
參考資料:《C專家編程》
《compliers》
http://en.wikipedia.org/wiki/Compiler
http://library.thinkquest.org/C001341/tuts/opentut.php3?mn=c&pn=t&id=21&page=1
如轉(zhuǎn)載請(qǐng)注明出處:http://www.rzrgm.cn/yanlingyin/
一條魚~博客園

浙公網(wǎng)安備 33010602011771號(hào)