三探·模块拼装思想(静态链接)
生活随笔
收集整理的這篇文章主要介紹了
三探·模块拼装思想(静态链接)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
程序設(shè)計的模塊化是程序員一直追求的目標(biāo),因為當(dāng)一個系統(tǒng)非常復(fù)雜的時候,我們就不得不把一個復(fù)雜的系統(tǒng)逐步分割成曉得系統(tǒng)以達到各個突破的目的。一個復(fù)雜軟件的開發(fā)過程也如此;首先把每個源代碼模塊獨立地編譯,然后按照需要將他們“組裝”起來,這個組裝過的過程就是我們通常說的鏈接的過程。鏈接的主要內(nèi)容就是把各個模塊之間相互引用的部分處理好,使得各個模塊之間能夠正確地銜接。
鏈接器所做的工作和程序員“人工調(diào)整地址”本質(zhì)上是一樣的。只不過現(xiàn)代高級語言的諸多特性和功能,使得編譯器、鏈接器更為復(fù)雜,功能更為強大。但是從原理上面講,她的工作無非就是把一些指令對其他符號地址的引用加以修正。鏈接過程主要包括地址和空間分配(Address and Storage Allocation)、符號決議(Symbol Resolution)和重定位(Relocation)等這些步驟。
1.靜態(tài)鏈接過程示意圖
每個模塊的源代碼文件(如.c文件)經(jīng)過編譯器編譯成目標(biāo)文件(Object File,一般擴展名為.o或.obj文件)。目標(biāo)文件與庫(libarary)一起鏈接形成最終的可執(zhí)行文件。而最常見的庫就是運行時庫(Runtime Library)。他是支持程序運行的基本函數(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ù)地址。 這里我們需要注意一點的是:當(dāng)func.c模塊被重新編譯,foo函數(shù)的地址有可能改變時,那么我們在main.c中所有使用到的foo地址指令將要全部重新調(diào)整。如果沒由鏈接器,那么這一項工作對于程序員來說就是一個噩夢!使用鏈接器,我們可以直接引用其他模塊的函數(shù)和全局變量而不用知道他們的地址!!!(這對程序員來說,無疑是個Big Surprise)因為連接器在鏈接的時候,會根據(jù)我們程序中所引用的foo符號,自動去相應(yīng)的func.c模塊中查找foo地址,然后將main.c模塊中所有引用到foo的指令重新進行修改,讓他們的目標(biāo)地址為真正的foo函數(shù)地址。這就是靜態(tài)鏈接的最基本的過程和作用。與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖
總結(jié)
以上是生活随笔為你收集整理的三探·模块拼装思想(静态链接)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二探·编译与连接
- 下一篇: 随便说说程序员团队精神的荣辱与共