目標文件及鏈接ppt課件_第1頁
目標文件及鏈接ppt課件_第2頁
目標文件及鏈接ppt課件_第3頁
目標文件及鏈接ppt課件_第4頁
目標文件及鏈接ppt課件_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、 目的文件及鏈接 1C/C+源文件cc1/g+頭文件匯編文件as目的文件生成庫銜接命令文件可重定位模塊ldar用戶庫庫列表可執(zhí)行程序23目的文件是什么樣的 ? 目的文件中的內(nèi)容至少有編譯后的機器指令代碼、數(shù)據(jù)。沒錯,除了這些內(nèi)容以外,目的文件中還包括了鏈接時所需求的一些信息,比如符號表、調(diào)試信息、字符串等。4目的文件的格式ABI ? 符號修飾規(guī)范、變量內(nèi)層規(guī)劃、函數(shù)調(diào)用方式等這些跟可執(zhí)行代碼二進制兼容性相關(guān)的內(nèi)容稱為ABIApplication Binary Interface。我們常見的ABI格式:A.outCOFFPEELF 普通目的文件將這些信息按不同的屬性,以“節(jié)Section的方式存

2、儲,有時候也叫“段Segment。5 a.out exec head.text.data.rel.text.rel.data.symtab.strtabstruct exec unsigned long a_midmag;unsigned long a_text;unsigned long a_data;unsigned long a_bss;unsigned long a_syms;unsigned long a_entry;unsigned long a_trsize;unsigned long a_drsize;a.out是早期unix系統(tǒng)運用的可執(zhí)行文件格式,由AT&T設計,由其格式和

3、頭部構(gòu)造可以看出,a.out格式非常緊湊,只包含程序運轉(zhuǎn)的必需信息代碼、數(shù)據(jù),每個節(jié)的順序是固定的,這種構(gòu)造這種構(gòu)造缺乏擴展性,如不能包含“現(xiàn)代可執(zhí)行文件中常見的調(diào)試信息 。如今根本上已被ELF格式取代。A.Out 目的文件的格式6COFF (文件頭部)Option Header(可選文件頭部)Section1 Header(節(jié)頭部)Section n Header(節(jié)頭部)Raw Data for Section 1(節(jié)數(shù)據(jù))Raw Data for Section n(節(jié)數(shù)據(jù))Relocation Info for Sect. 1(節(jié)重定位數(shù)據(jù)) Relocation Info for S

4、ect. n(節(jié)重定位數(shù)據(jù)) Line Numbers for Sect. 1(節(jié)行號數(shù)據(jù)) Line Numbers for Sect. n(節(jié)行號數(shù)據(jù)) Symbol TableString TableCOFF 目的文件的格式7Image Dos Header (IMAGE_DOS_HEADER)Image Dos StubPE FILE Header(IMAGE_NT_HEADERS)Image Header(IMAGE_FILE_HEADER)Image Optional Header(IMAGE_OPTIONAL_HEADER32)Section Table IMAGE_SECTIO

5、N_HEADER.text.data.drective.debug&Sother sectionsSymbol TablePE 目的文件的格式8ELF頭.text.rodata.data.bss.rel.text.rel.data.debug.line.strtab.symtab.shstrtabELF 目的文件的格式9int global_init_var = 84;int global_uninit_var;void func1( int i ) printf( %dn, i );int main(void) static int static_var = 85; static int s

6、tatic_var2; int a = 1; int b; func1( static_var + static_var2 + a + b ); return a; File Header.text.data.bssSimpleSection.c 10SimpleSection.o各段信息$ objdump -h SimpleSection.oSimpleSection.o: file format elf32-i386Sections:Idx Name Size VMA LMA File off Algn 0 .text 0000005b 00000000 00000000 00000034

7、 2*2 CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE1 .data 00000008 00000000 00000000 00000090 2*2 CONTENTS, ALLOC, LOAD, DATA2 .bss 00000004 00000000 00000000 00000098 2*2 ALLOC 3 .rodata 00000004 00000000 00000000 00000098 2*0 CONTENTS, ALLOC, LOAD, READONLY, DATA4 ment 0000002a 00000000 00000000 00

8、00009c 2*0 CONTENTS, READONLY5 .note.GNU-stack 00000000 00000000 00000000 000000c6 2*0 CONTENTS, READONLY11$ objdump -s -d SimpleSection.o 00000000 : 0: 55 push %ebp 1: 89 e5 mov %esp,%ebp 3: 83 ec 08 sub $0 x8,%esp 6: 8b 45 08 mov 0 x8(%ebp),%eax 9: 89 44 24 04 mov %eax,0 x4(%esp) d: c7 04 24 00 00

9、 00 00 movl $0 x0,(%esp) 14: e8 fc ff ff ff call 15 19: c9 leave 1a: c3 ret 0000001b : 1b: 8d 4c 24 04 lea 0 x4(%esp),%ecx 1f: 83 e4 f0 and $0 xfffffff0,%esp 22: ff 71 fc pushl -0 x4(%ecx) 25: 55 push %ebp 26: 89 e5 mov %esp,%ebp 28: 51 push %ecx 29: 83 ec 14 sub $0 x14,%esp 2c: c7 45 f4 01 00 00 00

10、 movl $0 x1,-0 xc(%ebp) 33: 8b 15 04 00 00 00 mov 0 x4,%edx 39: a1 00 00 00 00 mov 0 x0,%eax 3e: 8d 04 02 lea (%edx,%eax,1),%eax 41: 03 45 f4 add -0 xc(%ebp),%eax 44: 03 45 f8 add -0 x8(%ebp),%eax 47: 89 04 24 mov %eax,(%esp) 4a: e8 fc ff ff ff call 4b 4f: 8b 45 f4 mov -0 xc(%ebp),%eax 52: 83 c4 14

11、add $0 x14,%esp 55: 59 pop %ecx 56: 5d pop %ebp 57: 8d 61 fc lea -0 x4(%ecx),%esp 5a: c3 retSimpleSection.o反匯編代碼12ELF文件構(gòu)造描畫 ELF頭.text.rodata.data.bss.rel.text.rel.data.debug.line.strtab.symtab.shstrtab段頭表Elf32_Ehdre_shoffe_shentsizee_shnume_shstrndxElf32_Shdrsh_namesh_addrsh_offsetsh_sizeElf32_Symst

12、_namest_sizest_infost_shndx13ELF文件頭typedef struct unsigned char e_ident16; Elf32_Half e_type;/ Elf32_Half e_machine; Elf32_Word e_version; Elf32_Addr e_entry;/ Elf32_Off e_phoff; Elf32_Off e_shoff; Elf32_Word e_flags; Elf32_Half e_ehsize; Elf32_Half e_phentsize; Elf32_Half e_phnum; Elf32_Half e_shen

13、tsize; Elf32_Half e_shnum; Elf32_Half e_shstrndx; Elf32_Ehdr;描畫了字的大小產(chǎn)生此文件的系統(tǒng)的字節(jié)次序目的文件的類型機器類型節(jié)頭表的位置其它14段頭表 段頭表目的文件中各節(jié)的位置和大小處于目的文件的末尾ELF頭.text.rodata.data.bss.rel.text.rel.data.debug.line.strtab.symtab.shstrtab段頭表15text節(jié) 被編譯程序的機器代碼rodata節(jié) 諸如printf語句中的格式串和switch語句的跳轉(zhuǎn)表等只讀數(shù)據(jù)data節(jié) 已初始化的全局變量bss節(jié)m 節(jié) 未初始化的全局

14、變量 在目的文件中不占實踐的空間 ELF頭.text.rodata.data.bss.symtab.rel.text.rel.data.debug.line.strtab節(jié)頭表0描畫目的文件的節(jié)節(jié)16typedef struct Elf32_Word sh_name; Elf32_Word sh_type; Elf32_Word sh_flags;Elf32_Addr sh_addr;Elf32_Off sh_offset;Elf32_Word sh_size; Elf32_Word sh_link; Elf32_Word sh_info; Elf32_Word sh_addralign; E

15、lf32_Word sh_entsize; Elf32_Shdr;段描畫符Section header Descriptor每個段描畫符都對應一個段 17SimpleSection.o段表信息$ readelf -S SimpleSection.oThere are 11 section headers, starting at offset 0 x118:Section Headers:Nr NameType Addr Off Size ES Flg Lk Inf Al0 NULL 00000000 000000 000000 00 0 0 01 .text PROGBITS 0000000

16、0 000034 00005b 00 AX 0 0 42 .rel.textREL 00000000 000428 000028 089 1 43 .dataPROGBITS 00000000 000090 000008 00 WA 0 0 44 .bss NOBITS 00000000 000098 000004 00 WA 0 0 45 .rodataPROGBITS 00000000 000098 000004 00 A 0 0 16 mentPROGBITS 00000000 00009c 00002a 00 0 0 17 .note.GNU-stackPROGBITS 0000000

17、0 0000c6 000000 00 0 0 18 .shstrtab STRTAB 00000000 0000c6 000051 00 0 0 19 .symtab SYMTAB 00000000 0002d0 0000f0 10 10 10 410 .strtab STRTAB 00000000 0003c0 000066 00 0 0 118SimpleSection.o的段表及一切段的位置和長度19符號表&字符串表typedef struct Elf32_Word st_name; Elf32_Addr st_value; Elf32_Word st_size; unsigned ch

18、ar st_info; unsigned char st_other; Elf32_Half st_shndx; Elf32_Sym;offset+0+1+2+3+4+5+6+7+8+9+00shared0sw+10ap0+2020模塊之間組裝一個程序要想在內(nèi)存中運轉(zhuǎn),除了編譯之外還要經(jīng)過鏈接和裝入這兩個步驟。從程序員的角度來看,引入這兩個步驟帶來的益處就是可以直接在程序中運用printf和errno這種有意義的函數(shù)名和變量名,而不用明確指明printf和errno在規(guī)范C庫中的地址。當然,為了將程序員從早期直接運用地址編程的夢魘中挽救出來,編譯器和匯編器在這當中做出了革命性的奉獻。編譯器和匯

19、編器的出現(xiàn)使得程序員可以在程序中運用更具意義的符號來為函數(shù)和變量命名,這樣使得程序在正確性和可讀性等方面都得到了極大的提高。但是隨著C言語這種支持分別編譯的程序設計言語的流行,一個完好的程序往往被分割為假設干個獨立的部分并行開發(fā),而各個模塊間經(jīng)過函數(shù)接口或全局變量進展通訊。這就帶來了一個問題,編譯器只能在一個模塊內(nèi)部完成符號名到地址的轉(zhuǎn)換任務,不同模塊間的符號解析由誰來做呢? 21 鏈接是一個搜集、組織程序所需的不同代碼和數(shù)據(jù)的過程,以便程序能被裝入內(nèi)存并被執(zhí)行。鏈接過程分為兩步:-空間與地址分配掃描一切的輸入目的文件,獲得它們的各個段的長度、屬性和位置,并且將輸入目的文件中的符號定義和符號援

20、用搜集起來,一致放到一個全局符號表。這一步中,鏈接器將能獲得一切輸入目的文件的段長度,并且將它們合并,計算出輸出文件中各個段合并后的長度與位置,并建立映射關(guān)系。-符號解析與重定位 運用上面第一步中搜集到的一切信息,讀取輸入文件中段的數(shù)據(jù)、重定位信息,并且進展符號解析與重定位、調(diào)整代碼中的地址等?,F(xiàn)實上第二步是鏈接過程的中心,特別是重定位過程。鏈接22/*a.c*/extern int shared;int main() int a = 100; swap(&a, &shared);/*b.c*/int shared = 1;void swap(int *a, int *b) *a = *b =

21、 *a = *b; 看一個鏈接的例子23鏈接前后各個段的屬性$objdump h a.osections:Idx NameSize VMA LMA File off Algn0 .text00000034 00000000 00000000 00000034 2*2 CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE1 .data00000000 00000000 00000000 00000068 2*2 CONTENTS, ALLOC, LOAD,DATA2 .bss 00000000 00000000 00000000 00000068 2*2$ob

22、jdump h b.osections:Idx NameSize VMA LMA File off Algn0 .text0000003e 00000000 00000000 00000034 2*2 CONTENTS, ALLOC, LOAD, READONLY, CODE1 .data00000004 00000000 00000000 00000074 2*2 CONTENTS, ALLOC, LOAD,DATA2 .bss 00000000 00000000 00000000 00000078 2*2 ALLOC$objdump h absections:Idx NameSize VM

23、A LMA File off Algn0 .text00000072 08048094 08048094 00000094 2*2 CONTENTS, ALLOC, LOAD, READONLY, CODE1 .data00000004 08049108 08049108 00000108 2*2 CONTENTS, ALLOC, LOAD,DATA24目的文件、可執(zhí)行文件與進程空間25符號解析將每個符號援用正確地與某可重定位模塊的符號表中的一個符號定義相關(guān)聯(lián),從而確定各個符號援用的位置在一切輸入模塊中都找不到被援用符號的定義,那么打印錯誤音訊并終了鏈接需求定義解析規(guī)那么解析規(guī)那么函數(shù)和已初始

24、化的全局變量稱為強符號;未初始化的全局變量稱為弱符號不允許有多重的強符號定義出現(xiàn)一個強符號定義和多個弱符號定義時,選擇強符號的定義出現(xiàn)多個弱符號定義時,選擇恣意一個弱符號的定義 26符號重定位$ objdump -d a.o 00000000 : 0: 8d 4c 24 04 lea 0 x4(%esp),%ecx 4: 83 e4 f0 and $0 xfffffff0,%esp 7: ff 71 fc pushl 0 xfffffffc(%ecx) a: 55 push %ebp b: 89 e5 mov %esp,%ebp d: 51 push %ecx e: 83 ec 24 sub

25、$0 x24,%esp11:c7 45 f8 64 00 00 00 movl $0 x64,0 xfffffff8(%ebp)18:c7 44 24 04 00 0000 movl 0 x0,0 x4(%esp)1f: 00 20:8d 45 f8 lea 0 xfffffff8(%ebp),%eax23:89 04 24 mov %eax,(%esp)26:e8 fc ff ff ff call 27 2b:83 c4 24 add $0 x24,%esp2e:59 pop %ecx2f: 5d pop %ebp30:8d 61 fc lea 0 xfffffffc(%ecx),%esp3

26、3:c3 ret/*a.c*/extern int shared;int main() int a = 100; swap(&a, &shared);27符號重定位$ objdump -r a.o RELOCATION RECORDS FOR.text:OFFSET TYPE VALUE0000001C R_386_32shared00000027 R_386_PC32 swap宏定義值重定位修正方法R_386_321絕對尋址修正 S+AR_386_PC322相對尋址修正S+A-PA=保管在修正位置的值P=被修正的位置相對于段開場的偏移量或者虛擬地址,留意該值可以經(jīng)過r_offset計算得到S=符號的實踐地址,即由r_info的高24位指定的符號的實踐地址重定位表構(gòu)造typedef struct Elf32_Addr r_offset;Elf32_Word r_info; Elf32_Sym;28 如今讓我們假設在將a.o和b.o鏈接成最終可執(zhí)行文件后,main函數(shù)的虛擬地址為0 x1000,swap函數(shù)的虛擬地址為0 x2000,shared變量的虛擬地址為0 x3000。那么我們的鏈接器將如何修正a.o里面的這兩個重定位入口呢?相

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論