鏈接裝載與庫(kù)_第1頁(yè)
鏈接裝載與庫(kù)_第2頁(yè)
鏈接裝載與庫(kù)_第3頁(yè)
鏈接裝載與庫(kù)_第4頁(yè)
鏈接裝載與庫(kù)_第5頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

鏈接、裝載與庫(kù)在Linux下,當(dāng)我們使用gcc來(lái)編譯HelloWord程序時(shí),只需要$gcchello.c$./a.outHelloworld其中實(shí)際包括4步驟:預(yù)處理(Prepressinng),編譯(Compliation),匯編(Assembly),鏈接(Linking)1?預(yù)編譯$gcc-Ehello.c-ohello.i或$cpphelloc>hello.i預(yù)編譯主要處理源代碼文件中一“#開(kāi)始的預(yù)編譯指令。(刪除#define,處理預(yù)編譯指令,刪除〃/**/,添加文件行號(hào)和文件名標(biāo)示,保留所有編譯器指令#progam)。經(jīng)過(guò)預(yù)編譯的.i文件不包含任何宏定義,(所有宏定義已經(jīng)展開(kāi))。2?編譯編譯就是把預(yù)編譯完的文件進(jìn)行一系列詞法分析,語(yǔ)法分析,語(yǔ)義分析以及優(yōu)化后生成相應(yīng)匯編代碼文件。$gcc-shello.c-ohello.s詞法分析--識(shí)別單詞,確認(rèn)詞類;比如inti;知道int是一個(gè)類型,i是一個(gè)關(guān)鍵字以及判斷i的名字是否合法語(yǔ)法分析--識(shí)別短語(yǔ)和句型的語(yǔ)法屬性;語(yǔ)義分析--確認(rèn)單詞、短語(yǔ)和句型的語(yǔ)義特征;代碼優(yōu)化--修辭、文本編輯;代碼生成--生成譯文。內(nèi)聯(lián)函數(shù)的替換就發(fā)生在這一階段3?匯編匯編過(guò)程就是根據(jù)匯編指令和機(jī)器指令對(duì)照表進(jìn)行翻譯,生成目標(biāo)機(jī)器指令。在最終的目標(biāo)文件中除了擁有自己的數(shù)據(jù)和二進(jìn)制代碼之外,還要至少提供2個(gè)表:未解決符號(hào)表和導(dǎo)出符號(hào)表,分別告訴鏈接器自己需要什么和能夠提供什么。編譯器把一個(gè)cpp編譯為目標(biāo)文件的時(shí)候,除了要在目標(biāo)文件里寫(xiě)入cpp里包含的數(shù)據(jù)和代碼,還要至少提供3個(gè)表:未解決符號(hào)表,導(dǎo)出符號(hào)表和地址重定向表。未解決符號(hào)表提供了所有在該編譯單元里引用但是定義并不在本編譯單元里的符號(hào)及其出現(xiàn)的地址。導(dǎo)出符號(hào)表提供了本編譯單元具有定義,并且愿意提供給其他編譯單元使用的符號(hào)及其地址。地址重定向表提供了本編譯單元所有對(duì)自身地址的引用的記錄。$g++-cmain.s-omain.o4?鏈接將生成的目標(biāo)文件和系統(tǒng)庫(kù)文件進(jìn)行鏈接最終生成了可以在特定平臺(tái)運(yùn)行的可執(zhí)行文件。1?地址和空間分配從輸入目標(biāo)文件獲取各段長(zhǎng)度,屬性以及位置,并將輸入目標(biāo)文件中符號(hào)表所有符號(hào)定義和符號(hào)引用收集同意放到全局符號(hào)表。2?符號(hào)解析與重定位符號(hào)解析。將每個(gè)符號(hào)引用剛好和一個(gè)符號(hào)定義聯(lián)系起來(lái)。使用的表:符號(hào)表重定位。鏈接器把每個(gè)符號(hào)定義與一個(gè)虛擬地址聯(lián)系起來(lái),然后修改所有對(duì)這些符號(hào)的引用,使得它們指向這個(gè)存儲(chǔ)位置,從而重定位這些節(jié)。使用的表:重定位表,符號(hào)表鏈接器的工作順序:當(dāng)鏈接器進(jìn)行鏈接的時(shí)候,首先決定各個(gè)目標(biāo)文件在最終可執(zhí)行文件里的位置。然后訪問(wèn)所有目標(biāo)文件的地址重定義表,對(duì)其中記錄的地址進(jìn)行重定向(加上一個(gè)偏移量,即該編譯單元在可執(zhí)行文件上的起始地址)。然后遍歷所有目標(biāo)文件的未解決符號(hào)表,并且在所有的導(dǎo)出符號(hào)表里查找匹配的符號(hào),并在未解決符號(hào)表中所記錄的位置上填寫(xiě)實(shí)現(xiàn)地址。最后把所有的目標(biāo)文件的內(nèi)容寫(xiě)在各自的位置上,就生成一個(gè)可執(zhí)行文件。靜態(tài)庫(kù)鏈接在這種鏈接方式下,函數(shù)的代碼將從其所在地靜態(tài)鏈接庫(kù)中被拷貝到最終的可執(zhí)行程序中。這樣該程序在被執(zhí)行時(shí)這些代碼將被裝入到該進(jìn)程的虛擬地址空間中。靜態(tài)鏈接庫(kù)實(shí)際上是一個(gè)目標(biāo)文件的集合,其中的每個(gè)文件含有庫(kù)中的一個(gè)或者一組相關(guān)函數(shù)的代碼。動(dòng)態(tài)庫(kù)鏈接在此種方式下,函數(shù)的代碼被放到稱作是動(dòng)態(tài)鏈接庫(kù)或共享對(duì)象的某個(gè)目標(biāo)文件中。鏈接程序此時(shí)所作的只是在最終的可執(zhí)行程序中記錄下共享對(duì)象的名字以及其它少量的登記信息。在此可執(zhí)行文件被執(zhí)行時(shí),動(dòng)態(tài)鏈接庫(kù)的全部?jī)?nèi)容將被映射到運(yùn)行時(shí)相應(yīng)進(jìn)程的虛地址空間。動(dòng)態(tài)鏈接程序?qū)⒏鶕?jù)可執(zhí)行程序中記錄的信息找到相應(yīng)的函數(shù)代碼。對(duì)于可執(zhí)行文件中的函數(shù)調(diào)用,可分別采用動(dòng)態(tài)鏈接或靜態(tài)鏈接的方法。使用動(dòng)態(tài)鏈接能夠使最終的可執(zhí)行文件比較短小,并且當(dāng)共享對(duì)象被多個(gè)進(jìn)程使用時(shí)能節(jié)約一些內(nèi)存,因?yàn)樵趦?nèi)存中只需要保存一份此共享對(duì)象的代碼。但并不是使用動(dòng)態(tài)鏈接就一定比使用靜態(tài)鏈接要優(yōu)越。在某些情況下動(dòng)態(tài)鏈接可能帶來(lái)一些性能上損害。全局符號(hào)(強(qiáng)/弱)編譯器編譯源文件時(shí)會(huì)把源文件的全局符號(hào)(globalsymbol)分成強(qiáng)(strong)和弱(weak)兩類傳給匯編器,而隨后匯編器則將強(qiáng)弱信息編碼并保存在目標(biāo)文件的符號(hào)表中。那么何謂強(qiáng)弱呢?編譯器認(rèn)為函數(shù)與初始化了的全局變量都是強(qiáng)符號(hào),而未初始化的全局變量則成了弱符號(hào)。規(guī)則1:不允許強(qiáng)符號(hào)被多次定義(即不同的目標(biāo)文件中不能有同名的強(qiáng)符號(hào));規(guī)則2:如果一個(gè)符號(hào)在某個(gè)目標(biāo)文件中是強(qiáng)符號(hào),在其它文件中都是弱符號(hào),那么選擇強(qiáng)符號(hào);規(guī)則3:如果一個(gè)符號(hào)在所有目標(biāo)文件中都是弱符號(hào),那么選擇其中任意一個(gè);全局構(gòu)造與析構(gòu)—般C/C++程序從main()函數(shù)開(kāi)始,隨著main()結(jié)束而結(jié)束。其實(shí)在main()函數(shù)被調(diào)用前,為了程序順利執(zhí)行,要初始化進(jìn)程執(zhí)行環(huán)境。隊(duì)分

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論