程序的鏈接——重定位

前言:繼續(xù)程序的鏈接

之前我們說(shuō)過(guò)了「符號(hào)解析」,「符號(hào)解析」的本質(zhì)就是:建立定義與引用之間的聯(lián)系

而「重定位」的本質(zhì)就是:合并所有程序,程序中引用符號(hào)的地址修改為定義符號(hào)的絕對(duì)地址

重定位的全部流程

  • 合并相同的節(jié)(數(shù)據(jù)節(jié)和代碼節(jié))
  • 對(duì)「定義的符號(hào)」進(jìn)行重定位

    確定「定衣的符號(hào)」在虛擬空間的絕對(duì)地址逼龟,完成這一步以后,每個(gè)全局或局部變量都可確定地址

  • 對(duì)「引用符號(hào)」進(jìn)行重定位

    用上述「定義符號(hào)」的絕對(duì)地址修改 .text 和 .data 節(jié)中「引用符號(hào)」的地址

鏈接器是如何完成重定位的

一切要從匯編階段說(shuō)起:

當(dāng)程序編譯完成后,匯編能夠生成二進(jìn)制可重定位文件。生成的可重定位文件包含兩個(gè)節(jié)(IA-32):

  • .rel.text 函數(shù)
  • .rel.data 數(shù)據(jù)

每一個(gè)節(jié)都是一個(gè)表彼哼,每一個(gè)表包含多個(gè)表項(xiàng),每個(gè)表項(xiàng)的結(jié)構(gòu)如下:

typedef struct {
    Elf32_Addr r_offset;
    Elf32_Word r_info;
}ELF32_Rel;
  • r_offset 指出當(dāng)前需要重定位的位置相對(duì)于所在節(jié)起始位置的偏移量湘今。若重定位的是變量的位置敢朱,則所在節(jié)是 .data 節(jié),若重定位的是函數(shù)的位置摩瞎,則所在節(jié)是 .text 節(jié)
  • r_info 指出當(dāng)前的符號(hào)在符號(hào)表中的索引以及重定位類型蔫饰。前 24 位是符號(hào)索引(r_sym),后 8 位是重定位類型(r_type愉豺,在后面會(huì)指出)

當(dāng)鏈接器符號(hào)解析(靜態(tài))結(jié)束以后,E 集合中就有了所有目標(biāo)文件茫因。只需把需要重地位的符號(hào)修改成定義符號(hào)的地址就好了

在 IA-32 架構(gòu)中有兩種重定位的方式蚪拦,對(duì)應(yīng)著 r_type

  • R_386_PC32

  • R_386_32

自己這一塊有一些疑惑,也不細(xì)說(shuō)了冻押。只知道有 PC 的那個(gè)就是根據(jù) PC 重定位驰贷,沒(méi)有 PC 的那個(gè)方法,就是虛擬空間的絕對(duì)地址洛巢。

最后

再完整的說(shuō)一下符號(hào)靜態(tài)鏈接的全過(guò)程

  • 對(duì)每一個(gè)輸入文件來(lái)說(shuō)括袒,首先判斷是不是庫(kù)文件。
  • 如果不是庫(kù)文件稿茉,就是目標(biāo)文件 f锹锰。就能把目標(biāo)文件放入 E 中,根據(jù) f 中未解析符號(hào)和定義符號(hào)判斷后分別放入 U漓库、D 中

    比如說(shuō)恃慧,f 中有一個(gè)未解析符號(hào) k,如果 D 中存在對(duì)它的定義渺蒿,那么就可以建立聯(lián)系痢士。如果沒(méi)有就放入 U 中。

  • 如果是庫(kù)文件茂装,會(huì)試圖把所有 U 中的符號(hào)與庫(kù)文件中的符號(hào)匹配怠蹂,匹配上了就從 U 放入 D 中善延。并把匹配上的模塊放入 E 中。一直重復(fù)直到 U D 不再變化城侧。庫(kù)文件剩下的內(nèi)容直接就不管了易遣。
  • 如果往 D 中放入了一個(gè)已經(jīng)存在的符號(hào)或者掃描完所有文件后 U 還是非空,則鏈接器會(huì)停止并報(bào)錯(cuò)赞庶。否則將 E 中內(nèi)容經(jīng)過(guò)重定位后合并训挡,生成可執(zhí)行文件

如果我真的去實(shí)現(xiàn)一個(gè)編譯器的時(shí)候。我再完全弄懂里面的道道

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末歧强,一起剝皮案震驚了整個(gè)濱河市澜薄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌摊册,老刑警劉巖肤京,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異茅特,居然都是意外死亡忘分,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門白修,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)妒峦,“玉大人,你說(shuō)我怎么就攤上這事兵睛】虾В” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵祖很,是天一觀的道長(zhǎng)笛丙。 經(jīng)常有香客問(wèn)我,道長(zhǎng)假颇,這世上最難降的妖魔是什么胚鸯? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮笨鸡,結(jié)果婚禮上姜钳,老公的妹妹穿的比我還像新娘。我一直安慰自己形耗,他們只是感情好傲须,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著趟脂,像睡著了一般泰讽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,829評(píng)論 1 290
  • 那天已卸,我揣著相機(jī)與錄音佛玄,去河邊找鬼。 笑死累澡,一個(gè)胖子當(dāng)著我的面吹牛梦抢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播愧哟,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼奥吩,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蕊梧?” 一聲冷哼從身側(cè)響起霞赫,我...
    開(kāi)封第一講書(shū)人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎肥矢,沒(méi)想到半個(gè)月后端衰,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡甘改,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年旅东,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片十艾。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡抵代,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出忘嫉,到底是詐尸還是另有隱情荤牍,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布榄融,位于F島的核電站,受9級(jí)特大地震影響救湖,放射性物質(zhì)發(fā)生泄漏愧杯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一鞋既、第九天 我趴在偏房一處隱蔽的房頂上張望力九。 院中可真熱鬧,春花似錦邑闺、人聲如沸跌前。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)抵乓。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間灾炭,已是汗流浹背茎芋。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蜈出,地道東北人田弥。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像铡原,于是被迫代替她去往敵國(guó)和親偷厦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容