時(shí)間:2018-11-26 10:46:10來源:電子發(fā)燒友網(wǎng) 工程師曾玲
一個(gè)C程序可能是由多個(gè)分別編譯的部分組成,這些不同部分通過一個(gè)通常叫做鏈接器(或連接器,載入器)的程序合并成一個(gè)整體。因?yàn)榫幾g器一般每次只處理一個(gè)文件,所以它不能檢測出那些需要一次了解多個(gè)源程序文件才能察覺的錯(cuò)誤。而且,在許多系統(tǒng)中鏈接器是獨(dú)立于C語言實(shí)現(xiàn)的,因此如果前述錯(cuò)誤的原因與C語言相關(guān),鏈接器對(duì)此也同樣束手無策。某些C語言實(shí)現(xiàn)提供了一個(gè)稱為lint的程序,可以捕獲到大量的此類錯(cuò)誤,但遺憾的是并非全部的C語言實(shí)現(xiàn)都提供了該程序。如果能夠找到諸如lint的程序,就一定善加利用,這一點(diǎn)無論怎么強(qiáng)調(diào)都不為過。
C語言中的一個(gè)重要思想就是分別編譯(SeparateCompilation),即若干個(gè)源程序可以在不同的時(shí)候單獨(dú)進(jìn)行編譯,然后在恰當(dāng)?shù)臅r(shí)候整合到一起。但是,鏈接器一般是與C編譯器分離的,它不可能了解C語言的諸多細(xì)節(jié)。那么,鏈接器是如何做到把若干個(gè)C源程序合并成一個(gè)整體呢?盡管鏈接器并不理解C語言,然而它卻能夠理解機(jī)器語言和內(nèi)存布局。編譯器的責(zé)任就是把C源程序“翻譯”成對(duì)鏈接器有意義的形式,這樣鏈接器就能夠“讀懂”C源程序了。
典型的鏈接器把有編譯器或匯編器生成的若干個(gè)目標(biāo)模塊,整合成一個(gè)被稱為載入模塊或可執(zhí)行文件的實(shí)體,該實(shí)體能夠被操作系統(tǒng)直接執(zhí)行。其中,某些目標(biāo)模塊是直接作為輸入提供給鏈接器的;而另外一些目標(biāo)模塊則是根據(jù)鏈接過程的需要,從包括有類似printf函數(shù)的庫文件中取得的。鏈接器通常把目標(biāo)模塊看成是一組外部對(duì)象(externalobject)組成的。每個(gè)外部對(duì)象代表著機(jī)器內(nèi)存中的某個(gè)部分,并通過一個(gè)外部名稱來識(shí)別。因此,程序中的每個(gè)函數(shù)和每個(gè)外部變量,如果沒有聲明為static,就都是一個(gè)外部對(duì)象。某些C編譯器會(huì)對(duì)靜態(tài)函數(shù)和靜態(tài)變量的名稱做一定改變,將他們也作為外部對(duì)象。由于經(jīng)過了“名稱修飾”,所以他們不會(huì)與其它原程序文件中的同名函數(shù)或同名變量發(fā)生命名沖突。
大多數(shù)鏈接器都禁止同一個(gè)載入模塊中的兩個(gè)不同外部對(duì)象擁有相同的名稱。然而,在多個(gè)目標(biāo)模塊整合成一個(gè)載入模塊時(shí),這些目標(biāo)模塊可能就包含了同名的外部對(duì)象。鏈接器的一個(gè)重要工作就是處理這類命名沖突。處理命名沖突的最簡單的方法就是干脆完全禁止。對(duì)于外部對(duì)象是函數(shù)的情形,這種做法當(dāng)然正確,一個(gè)程序如果包括兩個(gè)同名的不同函數(shù),編譯器根本就不應(yīng)該接受。而對(duì)于外部對(duì)象是變量的情形,問題就變得有些困難了。不同的鏈接器對(duì)這種情形有著不同的處理方式。
鏈接器的輸入是一組目標(biāo)模塊或者庫文件。鏈接器的輸出是一個(gè)載入模塊。鏈接器讀入目標(biāo)模塊和庫文件,同時(shí)生成載入模塊。對(duì)每個(gè)目標(biāo)模塊中的每個(gè)外部對(duì)象,鏈接器要檢查載入模塊,看是否已有同名的外部對(duì)象。如果沒有,鏈接器就將該外部對(duì)象添加到載入模塊中;如果有,鏈接器就要開始處理命名沖突。
除了外部對(duì)象之外,目標(biāo)模塊中還可能包括了對(duì)其他模塊中的外部對(duì)象的引用。例如,一個(gè)調(diào)用了函數(shù)printf的C程序所生成的目標(biāo)模塊,就包括了一個(gè)對(duì)函數(shù)printf的引用??梢酝茰y得出,該引用指向的是一個(gè)位于某個(gè)庫文件中的外部對(duì)象。在鏈接器生成載入模塊的過程中,它必須同時(shí)記錄這些外部對(duì)象的引用。當(dāng)鏈接器讀入一個(gè)目標(biāo)模塊時(shí),它必須解析出這個(gè)目標(biāo)模塊中定義的所有外部對(duì)象的引用,并作出標(biāo)記說明這些外部對(duì)象不再是未定義的。
一個(gè)c程序可能是由多個(gè)分別編譯的部分組成,這些不同部分通過連接器合并成一個(gè)整體。因?yàn)榫幾g器一般每次只處理一個(gè)文件,所以吧能檢測出那些需要一次了解多個(gè)源程序文件才能察覺的錯(cuò)誤。某些c程序?qū)崿F(xiàn)提供了一個(gè)稱為lint的程序,可以捕獲大量的此類錯(cuò)誤,但不是所有的都能捕獲到!
標(biāo)簽:
中國傳動(dòng)網(wǎng)版權(quán)與免責(zé)聲明:凡本網(wǎng)注明[來源:中國傳動(dòng)網(wǎng)]的所有文字、圖片、音視和視頻文件,版權(quán)均為中國傳動(dòng)網(wǎng)(m.u63ivq3.com)獨(dú)家所有。如需轉(zhuǎn)載請(qǐng)與0755-82949061聯(lián)系。任何媒體、網(wǎng)站或個(gè)人轉(zhuǎn)載使用時(shí)須注明來源“中國傳動(dòng)網(wǎng)”,違反者本網(wǎng)將追究其法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明其他來源的稿件,均來自互聯(lián)網(wǎng)或業(yè)內(nèi)投稿人士,版權(quán)屬于原版權(quán)人。轉(zhuǎn)載請(qǐng)保留稿件來源及作者,禁止擅自篡改,違者自負(fù)版權(quán)法律責(zé)任。
產(chǎn)品新聞
更多>新品發(fā)布:CD300系列總線型伺服驅(qū)動(dòng)器
2024-10-31
2024-10-31
2024-10-31
新勢能 新期待|維智B1L直線伺服驅(qū)動(dòng)器
2024-10-31
2024-10-29
2024-10-18
推薦專題
更多>