日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

三探·模块拼装思想(静态链接)

發(fā)布時間:2025/3/15 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 三探·模块拼装思想(静态链接) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

程序設(shè)計(jì)的模塊化是程序員一直追求的目標(biāo),因?yàn)楫?dāng)一個系統(tǒng)非常復(fù)雜的時候,我們就不得不把一個復(fù)雜的系統(tǒng)逐步分割成曉得系統(tǒng)以達(dá)到各個突破的目的。一個復(fù)雜軟件的開發(fā)過程也如此;首先把每個源代碼模塊獨(dú)立地編譯,然后按照需要將他們“組裝”起來,這個組裝過的過程就是我們通常說的鏈接的過程。鏈接的主要內(nèi)容就是把各個模塊之間相互引用的部分處理好,使得各個模塊之間能夠正確地銜接。

鏈接器所做的工作和程序員“人工調(diào)整地址”本質(zhì)上是一樣的。只不過現(xiàn)代高級語言的諸多特性和功能,使得編譯器、鏈接器更為復(fù)雜,功能更為強(qiáng)大。但是從原理上面講,她的工作無非就是把一些指令對其他符號地址的引用加以修正。鏈接過程主要包括地址和空間分配(Address and Storage Allocation)、符號決議(Symbol Resolution)和重定位(Relocation)等這些步驟。

1.靜態(tài)鏈接過程示意圖


每個模塊的源代碼文件(如.c文件)經(jīng)過編譯器編譯成目標(biāo)文件(Object File,一般擴(kuò)展名為.o或.obj文件)。目標(biāo)文件與庫(libarary)一起鏈接形成最終的可執(zhí)行文件。而最常見的庫就是運(yùn)行時庫(Runtime Library)。他是支持程序運(yùn)行的基本函數(shù)集合。庫其實(shí)是一組目標(biāo)文件的包,就是一些最常用的代碼編輯成目標(biāo)文件后打包存放 :對于object文件沒有一個很合適的中文名稱,我們把它稱為中間目標(biāo)文件還是比較合適的,簡稱為目標(biāo)文件。

2.鏈接的內(nèi)部執(zhí)行過程

現(xiàn)代的鏈接和編譯過程也并非想想中的那么復(fù)雜,他還是一個比較容易理解的概念。比如我們在程序模塊main.c中使用另外一個模塊func.c中的函數(shù)foo()。我們在main.c模塊中每一處調(diào)用foo的時候都必須明確知道foo函數(shù)的地址,所以鏈接器暫時把這些調(diào)用foo函數(shù)的指令的目標(biāo)地址擱置,等待最后鏈接的時候由鏈接器區(qū)將這些指令的目標(biāo)地址修正。如果沒由鏈接器,那么我們就必須手動的修改,即填入正確的foo函數(shù)地址。 這里我們需要注意一點(diǎn)的是:當(dāng)func.c模塊被重新編譯,foo函數(shù)的地址有可能改變時,那么我們在main.c中所有使用到的foo地址指令將要全部重新調(diào)整。如果沒由鏈接器,那么這一項(xiàng)工作對于程序員來說就是一個噩夢!使用鏈接器,我們可以直接引用其他模塊的函數(shù)和全局變量而不用知道他們的地址!!!(這對程序員來說,無疑是個Big Surprise)因?yàn)檫B接器在鏈接的時候,會根據(jù)我們程序中所引用的foo符號,自動去相應(yīng)的func.c模塊中查找foo地址,然后將main.c模塊中所有引用到foo的指令重新進(jìn)行修改,讓他們的目標(biāo)地址為真正的foo函數(shù)地址。這就是靜態(tài)鏈接的最基本的過程和作用。
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的三探·模块拼装思想(静态链接)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。