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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

链接器(linker)的作用——CSAPP第7章读书笔记

發(fā)布時(shí)間:2025/4/5 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 链接器(linker)的作用——CSAPP第7章读书笔记 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

  首先說說我為什么要去讀這一章。這個(gè)學(xué)期開OS的課,在Morden Operating System上讀到和Process有關(guān)的內(nèi)容時(shí)看到這樣一句話:“Process is fundamentally a container that holds all the information needed to run a program.”當(dāng)時(shí)瞬間就想到了之前在csapp上看的模棱兩可的“目標(biāo)可執(zhí)行文件”這個(gè)概念,于是重新又把它的第7章給讀了一遍。


?

  要理解linker的作用,首先要搞明白他在整個(gè)計(jì)算機(jī)系統(tǒng)中處于一個(gè)什么樣的位置。

  關(guān)于一個(gè)程序是怎樣從碼農(nóng)們手撕的代碼變成內(nèi)存中能跑起來的程序這個(gè)過程就不再過多的敘述,這篇文章只是著重的去講一下有關(guān)linker的這一部分。我們可以看到,linker的接受的輸入是若干個(gè).o文件,簡(jiǎn)單的說就是經(jīng)過匯編器編譯后生成的機(jī)器碼,學(xué)名叫“relocatable object file(可重定位的目標(biāo)文件)”,概念相近的稱呼也有“module(模塊)”。而匯編器的輸出,是一個(gè)名叫“executable object program(目標(biāo)可執(zhí)行文件)”的二進(jìn)制文件,這個(gè)文件的特征就是可以直接拷貝到內(nèi)存中不需做任何的更改便可以運(yùn)行。那么我們研究linker的作用是什么就可以從這里入手——為了構(gòu)造最終的目標(biāo)可執(zhí)行文件,他需要對(duì)輸入若干可重定位的目標(biāo)文件做哪些事情?

  linker的作用主要有兩個(gè):

  (1)符號(hào)解析(symbol resolution):將每個(gè)符號(hào)的定義和每個(gè)符號(hào)的引用聯(lián)系起來。(就是讓系統(tǒng)明白,當(dāng)這個(gè)程序run的時(shí)候,遇到的具體的變量或函數(shù)名,他們到底來自哪個(gè)文件的定義?是自己這個(gè)?還是其他一起輸入linker的文件?)

  (2)重定位(relocation):把每個(gè)符號(hào)定義與存儲(chǔ)器中的一個(gè)具體位置聯(lián)系起來,然后修改所有對(duì)這些符號(hào)的引用,使得它們指向這個(gè)存儲(chǔ)器的位置,從而重定位這些節(jié)。(在取得了每個(gè)符號(hào)的引用和定義的連接之后,要把符號(hào)的定義在存儲(chǔ)器中綁定一個(gè)具體的地址)

  書中對(duì)符號(hào)的解釋不是太清楚,至少我一開始的時(shí)候沒太理解這個(gè)概念,在這兒結(jié)合書本的內(nèi)容我用自己的話來概括下我對(duì)這個(gè)概念的理解。“符號(hào)”可以分為3類:

  1、由該模塊定義的并且能被其他模塊引用的“全局符號(hào)”。這里的“全局符號(hào)”對(duì)應(yīng)于C語言中的非靜態(tài)的函數(shù)和全局變量。

  2、由其他模塊定義的由該模塊引用的“全局符號(hào)”。解釋同上

  3、由該模塊定義的并且不能被其他模塊引用的“全局符號(hào)”。對(duì)應(yīng)于C語言中的靜態(tài)變量,即static變量。static關(guān)鍵字相當(dāng)于C語言中的“private”,即只能被自己這個(gè)文件(模塊)使用的全局變量

  應(yīng)當(dāng)注意的是這里的變量全是全局變量而不是函數(shù)內(nèi)部的私有變量,私有變量由運(yùn)行時(shí)stack存儲(chǔ)管理,linker對(duì)她并不感興趣:)


?

  那么在了解了符號(hào)的概念之后,要想具體的了解linker對(duì)可重定位的目標(biāo)可執(zhí)行文件做的一些事情,就要了解relocatable object file的一些結(jié)構(gòu)(他是怎么記錄自身的各種符號(hào)信息的?)對(duì)不對(duì)?

  大家第一次看到這個(gè)圖不要害怕,其實(shí)這就是匯編器(Assembler)將編譯器處理的源代碼文件進(jìn)行進(jìn)一步的編譯或者說匯編之后形成的可重定位的目標(biāo)可執(zhí)行文件。這個(gè)文件的一個(gè)個(gè)小格子就是一個(gè)個(gè)的“節(jié)(section)”,他們存放該program的各種信息,在這里我只會(huì)解釋幾個(gè)我認(rèn)為對(duì)理解linker作用很有必要的section。

.text:已編譯程序的機(jī)器代碼。

.data:已初始化的全局C變量。

.bss:未初始化的全局C變量。在這里符號(hào)只是一個(gè)占位符,它不占用任何的內(nèi)存空間。

.symtab:一個(gè)符號(hào)表,存放在程序中定義和引用的函數(shù)和全部全局變量的信息。

.rel.test:存放代碼的重定位條目(relocation entry)。

.rel.data:存放數(shù)據(jù)的重定位條目。


?

  以上都屬于本章的基礎(chǔ)知識(shí)鋪墊部分,理解了上述內(nèi)容,就可以很容易的理解linker對(duì)可重定位的目標(biāo)可執(zhí)行文件所做的操作了。

1、符號(hào)解析

  linker解析符號(hào)的方法是將每個(gè)符號(hào)的引用與所有輸入的relocatable object file中的.symtab節(jié)中所有的符號(hào)定義中確定的一個(gè)聯(lián)系起來。

 1.1鏈接器如何解釋多重定義的全局符號(hào)?

  對(duì)于定義和引用都在一個(gè)module中的符號(hào),linker的操作很簡(jiǎn)單,不需要指來指去改來改去;而真正要深入探討的操作是對(duì)定義和引用不在同一個(gè)文件中的符號(hào),尤其是當(dāng)尋找到的符號(hào)定義有重名時(shí)。對(duì)此linker的做法是:

  (1)定義強(qiáng)符號(hào)和弱符號(hào)的概念。函數(shù)和已初始化的變量是強(qiáng)符號(hào),為初始化的變量是弱符號(hào)。

  (2)設(shè)定規(guī)則。當(dāng)有多重定義沖突的時(shí)候,linker遵循的規(guī)則是:

    one:不允許有多個(gè)強(qiáng)符號(hào)定義

    two:如果有一個(gè)強(qiáng)符號(hào)和多個(gè)弱符號(hào)定義,那么選擇強(qiáng)符號(hào)定義

    three:如果有多個(gè)弱符號(hào)定義,那么隨便選擇一個(gè)

 1.2與靜態(tài)庫鏈接

  為什么會(huì)有“靜態(tài)庫”(static libraries)這個(gè)概念?

  首先在C語言編程中,我們需要實(shí)現(xiàn)豐富的功能,就要使用各種各樣的函數(shù)接口。以ANSI C為例,它定義了一組廣泛的標(biāo)準(zhǔn)I/O、字符串操作和整數(shù)數(shù)學(xué)函數(shù),例如atoi、printf、scanf、strcpy、rand。他們?cè)趌ibc.a庫中,對(duì)每個(gè)C程序來說都是可用的。如果不使用靜態(tài)庫,我們看看編程開發(fā)人員可以用什么其他的辦法來向用戶提供這些函數(shù)。

  一種實(shí)現(xiàn)的方法是讓編譯器直接辨認(rèn)出對(duì)函數(shù)的調(diào)用,并直接生成相應(yīng)的代碼——這顯然是不可行的,C語言中有大量的函數(shù),這樣做顯然會(huì)使得編譯器的設(shè)計(jì)變得相當(dāng)復(fù)雜,每次添加、修改、刪除一個(gè)函數(shù)時(shí),都需要一個(gè)新的編譯器版本。雖然對(duì)于編程人員而言這樣是十分方便的,因?yàn)樗械臉?biāo)準(zhǔn)函數(shù)都是直接可用的。

  另一種實(shí)現(xiàn)的方法是將所有的這些函數(shù)放到一個(gè)單獨(dú)的可重定位的目標(biāo)可執(zhí)行文件中,它的優(yōu)點(diǎn)是將編譯器的設(shè)計(jì)與標(biāo)準(zhǔn)函數(shù)的實(shí)現(xiàn)分離開來,在一定程度上仍然便利編程人員。但是這樣做的缺點(diǎn)卻是每次運(yùn)行程序的時(shí)候都要將該裝載函數(shù)的rof文件copy到內(nèi)存中去,而這樣是很浪費(fèi)內(nèi)存空間的。而且同樣將這么一大批函數(shù)賽到一個(gè)文件中,每次的維護(hù)都要重現(xiàn)編譯整個(gè)源文件,這又是相當(dāng)大的一個(gè)工作量。

  何為靜態(tài)庫?

  在Unix中,靜態(tài)庫以archive這種特殊的文件格式存在于磁盤中,是一組連接起來的relocatable object file的集合。

  

 1.3鏈接器如何使用靜態(tài)庫來解析引用

  維護(hù)一個(gè)基于(U,E,D)三個(gè)集合的算法


?

2、重定位

  在這個(gè)過程中,將合并模塊并為每個(gè)符號(hào)分配運(yùn)行時(shí)的地址。重定位由兩個(gè)步驟組成:

  在這里有一個(gè)需要理解的概念是重定位條目(relocation entry)。在匯編器生成一個(gè)可重定位的目標(biāo)模塊時(shí),當(dāng)遇到UNDEFINED的符號(hào),即不知道該數(shù)據(jù)或代碼最終該存放到存儲(chǔ)器的什么位置時(shí),它就會(huì)為該符號(hào)生成一個(gè)重定位條目,即之前介紹的可重定位目標(biāo)文件中的.rel.text和.rel.data兩個(gè)表所記錄的內(nèi)容。

轉(zhuǎn)載于:https://www.cnblogs.com/immortal-worm/p/5819036.html

總結(jié)

以上是生活随笔為你收集整理的链接器(linker)的作用——CSAPP第7章读书笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 国产精品一区二区三区四区在线观看 | 色老头影视 | 久久精品23| 日本一级片在线播放 | 在线免费观看av片 | 艳母动漫在线播放 | 成人h片在线观看 | 免费av一区二区三区 | 六月丁香综合 | 日韩精品免费一区二区 | 免费在线观看成人av | 日本韩国中文字幕 | 免费处女在线破视频 | 欧美va在线观看 | 亚洲一区二区国产精品 | 九九热九九热 | 国产剧情在线 | 又大又粗欧美黑人aaaaa片 | 国产乱码精品一区二区三区忘忧草 | 久久久久久97 | 亚洲av综合一区 | 中文字幕有码av | 91精品观看 | 天堂网www在线 | 成人做爰视频www | 欧美日韩在线视频一区 | 国产乱人乱精一区二视频国产精品 | 在线免费看黄色 | 中文字幕人成人乱码亚洲电影 | 尤物国产在线 | 少妇又色又紧又黄又刺激免费 | 国产精品88久久久久久妇女 | 欧美激情18| 亚洲精品综合在线观看 | 色亭亭 | 亚洲人掀裙打屁股网站 | 亚洲日本在线观看 | 日韩中文字幕亚洲 | 欧美网| 久久久久久久影院 | 天天综合天天色 | 少妇高潮灌满白浆毛片免费看 | 日韩手机在线视频 | 日韩性猛交ⅹxxx乱大交 | 久久黄色免费网站 | 最近中文字幕在线观看 | 久久与婷婷 | 国产制服在线 | 精品嫩模一区二区三区 | 欧美一区二区三区久久综合 | 亚洲视频天天射 | 亚洲免费观看高清完整版在线 | 草av| 性――交――性――乱睡觉 | 日韩中文免费 | 99精品视频国产 | 日韩欧美精品在线 | 暴操白虎 | 日一区二区 | 成人欧美一区二区三区在线播放 | 风间由美一区二区三区 | 就要爱爱tv| 亚洲一区二区电影 | 天天色av | 丁五月 | 俺也去av | 日韩激情在线视频 | 欧美亚洲福利 | 日韩在线播放中文字幕 | 欧美性极品xxxx做受 | 噜噜色网| 成人网入口 | 欧美一区二区三区在线 | 92国产精品 | 国产不卡视频在线观看 | 国产女无套免费视频 | av在线播放地址 | 亚洲av中文无码乱人伦在线观看 | 97成人超碰 | 亚洲色偷精品一区二区三区 | 性久久久久久久久久久 | 俄罗斯美女一级爱片 | 久久综合九色综合欧美狠狠 | 免费av网站在线观看 | 欧美七区| 美女扒开腿男人爽桶 | 亚洲av成人无码久久精品老人 | 韩国美女福利视频 | 在线观看网站av | 朝桐光av一区二区三区 | 久久天天干 | 91国产一区 | 日本一区二区三区在线观看视频 | 久久久久久亚洲av无码专区 | 潘金莲黄色一级片 | 久久久久久久久蜜桃 | 男人天堂网址 | jizz在线免费观看 | 日韩射|