RM新时代|登录网址
<acronym id="aysek"><center id="aysek"></center></acronym>
<acronym id="aysek"></acronym>

新聞資訊

查看分類

連接器是怎么讀懂C源程序的

發布時間:2021-08-21 19:09:19  瀏覽次數: 1233

        一個C程序流程可能是由好幾個各自編譯程序的一部分構成,這種差異一部分根據一個一般 稱為連接器(或射頻連接器,載入器)的程序流程合拼成一個總體。由于編譯器一般每一次只解決一個文檔,因此 它無法檢驗出一些必須 一次掌握好幾個源程序文檔才可以發覺的不正確。并且,在很多操作系統中連接器是單獨于C語言完成的,因而假如上述情況不正確的緣由與C語言有關,連接器對于此事也一樣無計可施。一些C語言完成帶來了一個稱之為lint的程序流程,能夠捕捉到很多的該類不正確,但可惜的是并不是所有的C語言完成都保證了該程序流程。假如可以尋找例如lint的程序流程,就一定善加利用,這一點不管怎樣注重都不算過。

C語言中的一個關鍵觀念便是各自編譯程序(Separate Compilation),即多個源程序能夠在不一樣的情況下獨立開展編譯程序,隨后在適當的情況下融合到一起??墒?,連接器一般是與C編譯器分離出來的,它不太可能掌握C語言的許多關鍵點。那麼,連接器是怎么保證把多個C源程序合拼成一個總體呢?雖然連接器并不理解C語言,殊不知它卻可以了解程序設計語言和運行內存合理布局。編譯器的義務便是把C源程序“漢語翻譯”成對連接器更有意義的方式,那樣連接器就可以“了解”C源程序了。

  典型性的連接器把有編譯器或匯編器轉化成的多個目標模塊,融合成一個被稱作載入模塊或可執行程序的實體線,該實體線可以被電腦操作系統立即實行。在其中,一些目標模塊是立即做為鍵入給予給連接器的;而此外一些目標模塊則是依據連接全過程的必須 ,從包含有相近printf涵數的元件庫中得到的。連接器一般 把目標模塊當做是一組外界對象(external object)構成的。每一個外界對象意味著著設備運行內存中的某些一部分,并根據一個外界名字來鑒別。因而,程序流程中的每一個涵數和每一個外界自變量,要是沒有申明為staTIc,就全是一個外界對象。一些C編譯器會對靜態函數和靜態變量的名字做一定更改,將她們也做為外界對象。因為通過了“名字裝飾”,因此 她們不容易與其他原體系文件中的同名的涵數或同名的自變量產生取名矛盾。

  大部分連接器都嚴禁同一個載入模塊中的2個不一樣外界對象有著同樣的名字。殊不知,在好幾個目標模塊融合成一個載入模塊時,這種目標模塊很有可能就包括了重名的外界對象。連接器的一個關鍵工作中便是解決這類取名矛盾。解決取名矛盾的比較簡單的辦法便是索性徹底嚴禁。針對外界對象是涵數的情況,這類作法自然恰當,一個程序流程假如包含2個同名的的不一樣涵數,編譯器壓根便不應當接納。而針對外界對象是自變量的情況,難題就顯得很多艱難了。不一樣的連接器對這類情況擁有不一樣的處理方法。

  連接器的填寫是一組目標模塊或是元件庫。連接器的輸出是一個載入模塊。連接器讀取目標模塊和元件庫,與此同時轉化成載入模塊。對每一個目標模塊中的每一個外界對象,連接器要查驗載入模塊,看是不是已經有同名的的外界對象。要是沒有,連接器就將該外界對象加上到載入模塊中;如果有,連接器就需要逐漸解決取名矛盾。

  除開外界對象以外,目標模塊中還有可能包含了對別的模塊中的外界對象的引入。比如,一個啟用了涵數printf的C程序流程所產生的目標模塊,就涉及了一個對涵數printf的引入。能夠推斷得到,該引入偏向的是一個坐落于某一元件庫中的外界對象。在連接器轉化成載入模塊的環節中,它需要與此同時紀錄這種外界對象的引入。當連接器讀取一個目標模塊時,它務必分析出這一目標模塊中界定的任何外界對象的引入,并做出標識表明這種外界對象不會再是未定義的。


RM新时代|登录网址
<acronym id="aysek"><center id="aysek"></center></acronym>
<acronym id="aysek"></acronym>
RM新时代平台靠谱平台入口 RM新时代平台靠谱平台入口 RM新时代|中国官网产品
<acronym id="aysek"><center id="aysek"></center></acronym>
<acronym id="aysek"></acronym>
RM新时代登录网址 RM新时代反波胆app RM新时代成立多久了 rm体育 RM新时代app下载