程式員的自我修養: 目標檔案的本質

來源:互聯網
上載者:User

目標檔案的格式

Windows下為PE(Portable Executalbe),Linux為ELF(Executable Linkable Format), 他們都是COFF的變種. 下面都是以ELF格式檔案為例.

ELF檔案類型分為:

可重定位檔案(Relocatable File)      Linux的.o, windows的.obj

可執行檔(Executable File)          Linux的/bin/bash, windows的.exe

共用目標檔案(Shared Object File   Linux的.so, windows的DLL

核心轉儲檔案(Core Dump File)       Linux的core dump

 

ELF檔案分為:

程式碼片段

資料區段和唯讀資料區段

BSS段:存放未初始化的全域變數和局部靜態變數. .bss段只是為未初始化的全域變數和局部靜態變數預留位置而已,它並沒有內容, 所以它在檔案中也不佔據空間.

其他段

 

ELF檔案結構

1. ELF標頭檔

typedef struct{

    unsigned char e_ident[16];

    Elf32_Half e_type;  //ELF檔案類型

    Elf32_Half e_machine; //ELf檔案的CPU平台屬性

    Elf32_Word e_version;

    Ellf32_Addr e_entry; //入口地址, 規定ELF程式的入口虛地址

    Elf32_Off e_ohoff;

    Elf32_Off e_shoff; //段表在在這個檔案中的位移

    Elf32_Word e_flags;

    Elf32_Half e_ehsize; //ELF檔案頭本身的大小

    Elf32_Half e_phentsize;

    Elf32_half e_phnum;

    Elf32_Half e_shentsize; //段表描述符的大小

    Elf32_Half e_shnum; //段表描述符數量

    Elf32_Half e_shstrndx; //段表字串表所在的段在段表中的下標

}Elf32_Ehdr;

 

2. 段表

typedef struct{

    Elf_Word sh_name; //段名(是段名字串在.shstrtab中的位移)

    Elf_Word sh_type; //段的類型

    Elf_Word sh_flags; //段的標誌位

    Elf_Addr sh_addr; //段虛擬位址

    Elf_Off sh_offset; //段位移

    Elf_Word sh_size; //段的長度

    Elf_Word sh_link;

    Elf_Word sh_info;

    Elf_Word sh_addralign; //段地址對齊

    Elf_Word sh_entsize; //項的長度

 }Elf32_Shdr;

__________<br />ELF Header<br />e_shoff = 0x118<br />__________<br />.text<br />__________<br />.data<br />__________<br />.rodata<br />__________<br />.comment<br />__________<br />.strtab<br />__________<br />.shstrtab<br />__________<br />Section Table(段表)<br />__________<br />.symtab<br />__________ 0x00000426(因對齊的間隔)<br />__________ 0x00000428<br />.rel.text<br />__________<br />

 

3. 重定位表 Relocation Table

如printf. 段的類型為: SHT_REL

 

4. 字串表

.strtab .shstrtab 分別為字串表(儲存一般字元串)和段表字串表(儲存段表中用到的字串)

 

5. 符號表

typedef struct{

    Elf32_Word st_name; //符號名(符號名在字串表中的下標)

    Elf32_Addr st_value; //符號對應的值

    Elf32_Word st_size; //符號大小

    unsigned st_info;

    unsigned st_other;

    Elf32_Half st_shndx; //符號所在的段

}Elf32_Sym;

 

__________<br />ELF Header<br />__________<br />.text(程式碼片段)<br />__________<br />.data(資料區段)<br />__________<br />.rodata(唯讀資料區段)<br />__________<br />.comment<br />__________<br />.strtab(字串表)<br />__________<br />.shstrtab(段表字串表)<br />__________<br />Section Table(段表)<br />__________<br />.symtab(符號表)<br />__________<br />__________<br />.rel.text<br />__________<br />

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.