四、靜態(tài)鏈接

1.源代碼(a.c b.c)

extern int shared;

int main()
{
        int a = 100;
        swap( &a, &shared );
        return 0;
}
int shared = 1;

void swap( int *a, int *b )
{
        *a = *a ^ *b;
        *b = *a ^ *b;
        *a = *a ^ *b;
}

結(jié)合$ readelf -S$ readelf -s的輸出被环,可以獲取到兩個(gè)目標(biāo)文件的Section信息和symbol信息等

2.空間和地址分配

目標(biāo)文件a.o和b.o鏈接輸出可執(zhí)行文件ab糙及,它們的Section是如何合并到輸出文件中的?輸出文件和虛擬內(nèi)存中的地址和空間又是如何分配的筛欢?

  • 相似段合并
    • 空間與地址分配
      掃描所有的目標(biāo)文件浸锨,獲取各個(gè)Section的長(zhǎng)度、屬性和位置版姑,收集符號(hào)表中的所有符號(hào)定義和符號(hào)引用柱搜;合并,計(jì)算出輸出文件中各個(gè)段合并后的位置和長(zhǎng)度剥险,并建立映射關(guān)系
    • $ ld a.o b.o -e main -o ab -melf_i386
$ objdump -h a.o b.o ab

a.o:     file format elf32-i386

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         0000002c  00000000  00000000  00000034  2**2
                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
  1 .data         00000000  00000000  00000000  00000060  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          00000000  00000000  00000000  00000060  2**2
                  ALLOC
  3 .comment      0000002b  00000000  00000000  00000060  2**0
                  CONTENTS, READONLY
  4 .note.GNU-stack 00000000  00000000  00000000  0000008b  2**0
                  CONTENTS, READONLY
  5 .eh_frame     00000038  00000000  00000000  0000008c  2**2
                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA

b.o:     file format elf32-i386

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         00000038  00000000  00000000  00000034  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         00000004  00000000  00000000  0000006c  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          00000000  00000000  00000000  00000070  2**2
                  ALLOC
  3 .comment      0000002b  00000000  00000000  00000070  2**0
                  CONTENTS, READONLY
  4 .note.GNU-stack 00000000  00000000  00000000  0000009b  2**0
                  CONTENTS, READONLY
  5 .eh_frame     00000038  00000000  00000000  0000009c  2**2
                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA

ab:     file format elf32-i386

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         00000064  08048094  08048094  00000094  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .eh_frame     00000058  080480f8  080480f8  000000f8  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  2 .data         00000004  08049150  08049150  00000150  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  3 .comment      0000002a  00000000  00000000  00000154  2**0
                  CONTENTS, READONLY

從合并后的文件ab可以看出聪蘸,合并的各個(gè)段已經(jīng)在虛擬內(nèi)存中分配了地址(VMA)

  • 符號(hào)地址的確定
    • 符號(hào)解析與重定位
      使用第一步收集到的所有信息,讀取輸入文件中的Section的數(shù)據(jù)表制、重定位信息健爬,進(jìn)行符號(hào)解析與重定位、調(diào)整代碼中的地址
    • 經(jīng)過(guò)相似段合并過(guò)程么介,各個(gè)段在虛擬地址空間中的地址已經(jīng)確定了娜遵,各個(gè)符號(hào)定義 的地址也已經(jīng)確定了(段的虛擬地址加上符號(hào)定義的偏移量)
    • 重定位過(guò)程是針對(duì)代碼中的符號(hào)引用的地址的修改
$ objdump -d a.o ab   部分結(jié)果,主要是main函數(shù)

a.o:     file format elf32-i386

Disassembly of section .text:

00000000 <main>:
   0:   55                      push   %ebp
   1:   89 e5                   mov    %esp,%ebp
   3:   83 e4 f0                and    $0xfffffff0,%esp
   6:   83 ec 20                sub    $0x20,%esp
   9:   c7 44 24 1c 64 00 00    movl   $0x64,0x1c(%esp)
  10:   00 
  11:   c7 44 24 04 00 00 00    movl   $0x0,0x4(%esp)       對(duì)shared變量的引用
  18:   00 
  19:   8d 44 24 1c             lea    0x1c(%esp),%eax
  1d:   89 04 24                mov    %eax,(%esp)
  20:   e8 fc ff ff ff          call   21 <main+0x21>       對(duì)swap函數(shù)的調(diào)用
  25:   b8 00 00 00 00          mov    $0x0,%eax
  2a:   c9                      leave  
  2b:   c3                      ret    

ab:     file format elf32-i386


Disassembly of section .text:

08048094 <main>:
 8048094:       55                      push   %ebp
 8048095:       89 e5                   mov    %esp,%ebp
 8048097:       83 e4 f0                and    $0xfffffff0,%esp
 804809a:       83 ec 20                sub    $0x20,%esp
 804809d:       c7 44 24 1c 64 00 00    movl   $0x64,0x1c(%esp)
 80480a4:       00 
 80480a5:       c7 44 24 04 50 91 04    movl   $0x8049150,0x4(%esp)    對(duì)shared變量的地址引用&shared
 80480ac:       08 
 80480ad:       8d 44 24 1c             lea    0x1c(%esp),%eax
 80480b1:       89 04 24                mov    %eax,(%esp)
 80480b4:       e8 07 00 00 00          call   80480c0 <swap>   對(duì)swap函數(shù)的調(diào)用
 80480b9:       b8 00 00 00 00          mov    $0x0,%eax
 80480be:       c9                      leave  
 80480bf:       c3                      ret 

c7 44 24 是movl指令夭拌,后邊的4個(gè)字節(jié)是地址魔熏,可以看到鏈接過(guò)程,對(duì)符號(hào)地址做了重定位修正

重定位過(guò)程的完成需要重定位表的協(xié)助鸽扁,.text的重定位表是.rel.text

  • 重定位表每一個(gè)表項(xiàng)的結(jié)構(gòu)體
typedef struct
{
 Elf32_Addr    r_offset;       /* Address */
 Elf32_Word    r_info;         /* Relocation type and symbol index */
} Elf32_Rel;

offset 代表相對(duì)于要修正的段的偏移地址蒜绽,r_info 包含了重定位符號(hào)的信息(符號(hào)表的下標(biāo))

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市桶现,隨后出現(xiàn)的幾起案子躲雅,更是在濱河造成了極大的恐慌,老刑警劉巖骡和,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件相赁,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡慰于,警方通過(guò)查閱死者的電腦和手機(jī)钮科,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)婆赠,“玉大人绵脯,你說(shuō)我怎么就攤上這事。” “怎么了蛆挫?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵赃承,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我悴侵,道長(zhǎng)瞧剖,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任可免,我火速辦了婚禮抓于,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘巴元。我一直安慰自己毡咏,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布逮刨。 她就那樣靜靜地躺著呕缭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪修己。 梳的紋絲不亂的頭發(fā)上恢总,一...
    開(kāi)封第一講書(shū)人閱讀 51,624評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音睬愤,去河邊找鬼片仿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛尤辱,可吹牛的內(nèi)容都是我干的砂豌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼光督,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼阳距!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起结借,我...
    開(kāi)封第一講書(shū)人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤筐摘,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后船老,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體咖熟,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年柳畔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了馍管。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡薪韩,死狀恐怖咽斧,靈堂內(nèi)的尸體忽然破棺而出堪置,到底是詐尸還是另有隱情,我是刑警寧澤张惹,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站岭洲,受9級(jí)特大地震影響宛逗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜盾剩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一雷激、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧告私,春花似錦屎暇、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蜀撑,卻和暖如春挤巡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背酷麦。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工矿卑, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人沃饶。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓母廷,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親糊肤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子琴昆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

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