第七章 鏈接——關(guān)于可執(zhí)行目標文件的運行時地址與文件中偏移的一些疑問

在CSAPP鏈接相關(guān)章節(jié)中中狂,書中描述了鏈接大概分為兩步,第一步為符號解析唤蔗,第二步便是重定位。其中書中描述 (P478) 重定位時會合并各個重定位目標文件中相同類型的節(jié),然后鏈接器會將運行時內(nèi)存地址賦給各個節(jié)妓柜。

書中提到了段要加載到內(nèi)存時箱季,應(yīng)該放在的地址保存在程序頭部表中(Program header table),它描述了將文件各段映射到運行時內(nèi)存的一些參數(shù),但并未對運行時地址展開描述领虹。

  • 該表記錄了數(shù)據(jù)段规哪,代碼段等在文件中的偏移,以及長度塌衰,該段要被加載至內(nèi)存哪個地址诉稍,以及對其要求。

猜測:

  • 數(shù)據(jù)段代碼段總是被加載至內(nèi)存固定的位置最疆,即表中記錄的地址杯巨。
  • 被定義的全局符號總是有固定的虛擬內(nèi)存地址。
  • 在重定位的過程中努酸,是計算符號定義的運行時地址(符號定義在內(nèi)存中的地址)服爷,然后通過計算文件內(nèi)部的這個引用的偏移,將其裝填到這里获诈。

=================下面不作數(shù)=====================

我們可以進行一個簡單的測試:

  • 查看這個可執(zhí)行目標文件的程序頭部表仍源,記錄下代碼段和數(shù)據(jù)段的 vaddrpaddr舔涎,然后執(zhí)行該文件笼踩,查看內(nèi)存代碼段和數(shù)據(jù)段的地址,是否就是該表所記錄的亡嫌。
  • 找一個使用相對地址重定位的引用嚎于,取這個引用上的地址,然后將vaddr所記錄運行地址代入計算挟冠,查看結(jié)果是否一致于购。

對于一個極其簡單的C - testA.c 程序:

int test_var = 1;
int main(){
    test_var = 10;;
}

將其編譯為可重定位目標文件,并查看這個文件的反匯編代碼:

>>> gcc -c -o testA.o testA.c
>>> objdump -d -F testA.o

0000000000000000 <main> (File Offset: 0x40):
   0:   c7 05 00 00 00 00 0a    movl   $0xa,0x0(%rip)        # a <main+0xa> (File Offset: 0x4a)
   ....

我們可以看到重定位條目知染,在.text節(jié)內(nèi)偏移 0xa 處需要進行一個重定位肋僧,這正是對全局變量 test_var 的引用,而rip存放PC值控淡,這條指令的意思就是把常數(shù) 0xa 存放至 PC + addr 這個地址上色瘩,而此處的 addr 還未被重定位,就是一串 0逸寓。

然后我們將這個可重定位目標文件鏈個可執(zhí)行目標文件,然后查看反匯編數(shù)據(jù):

>>> gcc -c -o testA.out testA.o

對這個可執(zhí)行目標文件進行反匯編:

>>> objdump -d -F testA.out

00000000004004d6 <main> (File Offset: 0x4d6):
  4004d6:   c7 05 50 0b 20 00 0a    movl   $0xa,0x200b50(%rip)        # 601030 <test_var> (File Offset: 0x201030)
    ...
Disassembly of section .data:
0000000000601030 <test_var> (File Offset: 0x1030):

  601030:   01 00                   add    %eax,(%rax)
    ...

由于 objdump 反匯編時顯示的地址是 complete address (man objdump中所述)居兆,不是文件內(nèi)偏移,可以通過 -F 命令顯示出具體指令在文件內(nèi)部的偏移竹伸。

我們查看其程序頭部表泥栖,挑出數(shù)據(jù)段與代碼段相關(guān)信息:

>>> objdump -d -F testA.out
  INTERP off    0x0000000000000238 vaddr 0x0000000000400238 paddr 0x0000000000400238 align 2**0
         filesz 0x000000000000001c memsz 0x000000000000001c flags r--
    LOAD off    0x0000000000000000 vaddr 0x0000000000400000 paddr 0x0000000000400000 align 2**21
         filesz 0x0000000000000694 memsz 0x0000000000000694 flags r-x  // 代碼段
    LOAD off    0x0000000000000e10 vaddr 0x0000000000600e10 paddr 0x0000000000600e10 align 2**21
         filesz 0x0000000000000224 memsz 0x0000000000000228 flags rw-  //數(shù)據(jù)段

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末簇宽,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子吧享,更是在濱河造成了極大的恐慌魏割,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钢颂,死亡現(xiàn)場離奇詭異钞它,居然都是意外死亡,警方通過查閱死者的電腦和手機殊鞭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門遭垛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人操灿,你說我怎么就攤上這事锯仪。” “怎么了趾盐?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵庶喜,是天一觀的道長。 經(jīng)常有香客問我救鲤,道長久窟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任本缠,我火速辦了婚禮斥扛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘搓茬。我一直安慰自己,他們只是感情好队他,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布卷仑。 她就那樣靜靜地躺著,像睡著了一般麸折。 火紅的嫁衣襯著肌膚如雪锡凝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天垢啼,我揣著相機與錄音窜锯,去河邊找鬼。 笑死芭析,一個胖子當著我的面吹牛锚扎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播馁启,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼驾孔,長吁一口氣:“原來是場噩夢啊……” “哼芍秆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起翠勉,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤妖啥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后对碌,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體荆虱,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年朽们,在試婚紗的時候發(fā)現(xiàn)自己被綠了怀读。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡华坦,死狀恐怖愿吹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情惜姐,我是刑警寧澤犁跪,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站歹袁,受9級特大地震影響坷衍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜条舔,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一枫耳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧孟抗,春花似錦迁杨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至摊沉,卻和暖如春狐史,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背说墨。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工骏全, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人尼斧。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓姜贡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親棺棵。 傳聞我的和親對象是個殘疾皇子鲁豪,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355