目錄
0. 引言 1. ELF文件格式 2. ELF格式分析工具
0. 引言
0x1: ELF文件類型
ELF文件標准里把系統中采用ELF格式的文件歸為以下幾類
1. 可重定位文件(Relocatable File) 這類文件包含了代碼和數據,可以被用來鏈接成可執行文件或共享目標文件,靜態鏈接庫也可以歸為這一類 1) .o文件 2. 可執行文件(Executable File) 這類文件包含了可以直接執行的程序,它的代表就是ELF可執行文件,它們一般都沒有擴展名 1) /bin/bash文件 3. 共享目標文件(Shared Object File) 這種文件包含了代碼和數據,可以在以下兩種情況下使用 1) 鏈接器可以使用這種文件跟其他的可重定位文件和共享目標文件鏈接,產生新的目標文件 2) 動態鏈接器可以將幾個這種共享目標文件與可執行文件結合,作為進程映像的一部分來運行 共享目標文件典型的類型就是: .so文件 4. 核心轉儲文件(Core Dump File) 當進程意外終止時,系統可以將該進程的地址空間的內容及終止時的一些其他信息轉儲到核心轉儲文件 1) core dump
1. ELF文件格式
我們知道,對於windows中使用的PE文件結構來說,也存在一種"磁盤上PE結構"和"內存中PE結構"的概念,原因在於操作系統為了提高CPU的讀寫效率,會在將磁盤上的PE鏡像裝載映射到內存中的時候進行"內存頁邊界對齊"(例如對應32位機器來說就是4KB,不足4KB的用00進行Padding),所以我們在程序動態運行時查看進程的dump會看到大量的00
同樣,對於Linux也是一樣的,對於ELF格式來說,存在
1. 鏈接視圖(磁盤上的靜態格式) 2. 以及執行視圖(內存中的運行時格式)

下面我們來詳細學習一下ELF的文件格式
|   ELF中常用數據格式名稱  |  
             大小  |  
             對齊  |  
             目的  |  
          
|   Elf32_Addr  |  
             4  |  
             4  |  
             無符號程序地址  |  
          
|   Elf32_Half  |  
             2  |  
             2  |  
             無符號中等整數  |  
          
|   Elf32_Off  |  
             4  |  
             4  |  
             無符號文件偏移  |  
          
|   Elf32_SWord  |  
             4  |  
             4  |  
             有符號大整數  |  
          
|   Elf32_Word  |  
             4  |  
             4  |  
             無符號大整數  |  
          
|   unsigned char  |  
             1  |  
             1  |  
             無符號小整數  |  
          
0x1: ELF Header
文件開始處是一個ELF頭部(ELF Header),用來描述整個文件的組織,這些信息獨立於處理器,也獨立於文件中的其余內容
/usr/include/elf.h
#define EI_NIDENT 16 typedef struct { /* 1. e_ident數組(16 bytes) 給出了ELF的一些標識信息 1) EI_MAG: 魔數(4 bytes): 標志此文件是一個 ELF 目標文件 1.1) e_ident[0]: 0x7f 1.2) e_ident[1]: 'E' 1.3) e_ident[2]: 'L' 1.4) e_ident[3]: 'F' 2) EI_CLASS: 文件的類別(1 byte): 或者說是位寬 2.1) ELFCLASSNONE: 0: 非法類別 2.2) ELFCLASS32: 1: 32位目標 2.3) ELFCLASS64: 2: 64位目標 3) EI_DATA: 處理器特定數據的數據編碼方式 3.1) ELFDATANONE: 0: 非法數據編碼 3.2) ELFDATA2LSB: 1: 高位在前 3.3) ELFDATA2MSB: 2: 低位在前 4) EI_VERSION: ELF 頭部的版本號碼,此值必須是EV_CURRENT 5) EI_PAD: 標記e_ident 中未使用字節的開始,初始化為0 */ unsigned char e_ident[EI_NIDENT]; /* 2. e_type(2 bytes): 目標文件類型 1) ET_NONE: 0: 未知目標文件格式 2) ET_REL: 1: 可重定位文件 3) ET_EXEC: 2: 可執行文件 4) ET_DYN: 3: 共享目標文件 5) ET_CORE: 4: Core文件(轉儲格式0 6) ET_LOPROC: 0xff00: 特定處理器文件 7) ET_HIPROC: 0xffff: 特定處理器文件 ET_LOPROC和ET_HIPROC之間的取值用來標識與處理器相關的文件格式 */ Elf32_Half e_type; /* 3. e_machine(2 bytes): 文件的目標體系結構類型 */ Elf32_Half e_machine; 1) EM_NONE: 0: 未指定 2) EM_M32: 1: AT&T WE 32100 3) EM_SPARC: 2: SPARC 4) EM_386: 3: Intel 80386 5) EM_68K: 4: Motorola 68000 6) EM_88K: 5: Motorola 88000 7) EM_860: 7: Intel 80860 8) EM_MIPS: 8: MIPS RS3000 /* 4. e_version(4 bytes): 目標文件版本 1) EV_NONE: 0: 非法版本 2) EV_CURRENT: 1: 當前版本 */ Elf32_Word e_version; /* 5. e_entry(4 bytes): 程序入口的虛擬地址,如果目標文件沒有程序入口,可以為0 */ Elf32_Addr e_entry; /* 6. e_phoff(4 bytes): 程序頭部表格(Program Header Table)的偏移量(按字節計算),如果文件沒有程序頭部表格,可以為0 */ Elf32_Off e_phoff; /* 7. e_shoff(4 bytes): 節區頭部表格(Section Header Table)的偏移量(按字節計算)。如果文件沒有節區頭部表格,可以為0 */ Elf32_Off e_shoff; /* 8. e_flags(4 bytes): 保存與文件相關的,特定於處理器的標志。標志名稱采用EF_machine_flag的格式 */ Elf32_Word e_flags; /* 9. e_ehsize(2 bytes): ELF頭部的大小(以字節計算) */ Elf32_Half e_ehsize; /* 10. e_phentsize(2 bytes): 程序頭部表格的表項大小(按字節計算) */ Elf32_Half e_phentsize; /* 11. e_phnum(2 bytes): 程序頭部表格的表項數目,可以為0 */ Elf32_Half e_phnum; /* 12. e_shentsize(2 bytes): 節區頭部表格的表項大小(按字節計算) */ Elf32_Half e_shentsize; /* 13. e_shnum(2 bytes): 節區頭部表格的表項數目,可以為0 */ Elf32_Half e_shnum; /* 14. e_shstrndx(2 bytes): 節區頭部表格中與節區名稱字符串表相關的表項的索引。如果文件沒有節區名稱字符串表,此參數可以為SHN_UNDEF */ Elf32_Half e_shstrndx; }Elf32_Ehdr;

0x2: 程序頭部表(Program Header Table) 
可執行文件或者共享目標文件的程序頭部的大致結構如下:
1. 結構數組 每個數組元素表示: 1) 一個"段" 1.1) 包含一個或者多個"節區" 程序頭部僅對於可執行文件和共享目標文件有意義 2) 或者"系統准備程序執行所必需的其它信息"
可執行目標文件在ELF頭部的e_phentsize和e_phnum成員中給出其自身程序頭部的大小以及元素數量
我們知道,程序頭部表(Program Header Table)是個數組結構,它的每一個元素的數據結構如下
typedef struct { /* 1. p_type(4 bytes): 段類型 1) PT_NULL: 0: 此數組元素未用。結構中其他成員都是未定義的 2) PT_LOAD: 1: 此數組元素給出一個可加載的段,段的大小由p_filesz和p_memsz描述。文件中的字節被映射到內存段開始處。如果p_memsz大於p_filesz,"剩余"的字節要清零。p_filesz不能大於p_memsz。可加載
的段在程序頭部表格中根據p_vaddr 成員按升序排列 3) PT_DYNAMIC: 2: 數組元素給出動態鏈接信息 4) PT_INTERP: 3: 數組元素給出一個NULL結尾的字符串的位置和長度,該字符串將被當作解釋器調用。這種段類型僅對與可執行文件有意義(盡管也可能在共享目標文件上發生)。在一個文件中不能出現一次以上。如果存在
這種類型的段,它必須在所有可加載段項目的前面。 5) PT_NOTE: 4: 此數組元素給出附加信息的位置和大小 6) PT_SHLIB: 5: 此段類型被保留,不過語義未指定。包含這種類型的段的程序與ABI(應用程序二進制接口 Application Binary Interface,ABI)不符 7) PT_PHDR: 6: 此類型的數組元素如果存在,則給出了程序頭部表自身的大小和位置,既包括在文件中也包括在內存中的信息。此類型的段在文件中不能出現一次以上。並且只有程序頭部表是程序的內存映像的一部分時才起
作用。如果存在此類型段,則必須在所有可加載段項目的前面。 8) PT_LOPROC(0x70000000)~PT_HIPROC(0x7fffffff): 此范圍的類型保留給處理器專用語義 */ Elf32_Word p_type; /* 2. p_offset(4 bytes): 從文件頭到該段第一個字節的偏移 */ Elf32_Off p_offset; /* 3. p_vaddr(4 bytes): 段的第一個字節將被放到內存中的虛擬地址(思考為什么和磁盤上的靜態偏移不同,結合內存對齊,頁大小等知識) */ Elf32_Addr p_vaddr; /* 4. p_paddr(4 bytes): 用於與物理地址相關的系統中。因為System V忽略所有應用程序的物理地址信息,此字段對與可執行文件和共享目標文件而言具體內容是未指定的 */ Elf32_Addr p_paddr; /* 5. p_filesz(4 bytes): 給出段在文件映像中所占的字節數。可以為0 */ Elf32_Word p_filesz; /* 6. p_memsz(4 bytes): 給出段在內存映像中占用的字節數。可以為0 */ Elf32_Word p_memsz; /* 7. p_flags(4 bytes): 給出與段相關的標志 */ Elf32_Word p_flags; /* 8. p_align(4 bytes): 給出段在文件中和內存中如何對齊。數值0和1表示不需要對齊。否則p_align應該是個正整數,並且是2的冪次數,p_vaddr和p_offset對 p_align取模后應該相等 */ Elf32_Word p_align; } Elf32_phdr;

通過readelf和winhex進行對照學習
0x3: 節區
節區滿足以下條件:
1. 目標文件中的每個節區都有對應的節區頭部描述它,反過來,有節區頭部不意味着有節區 2. 每個節區占用文件中一個連續字節區域(這個區域可能長度為0) 3. 文件中的節區不能重疊,不允許一個字節存在於兩個節區中的情況發生 4. 目標文件中可能包含非活動空間(INACTIVE SPACE)。這些區域不屬於任何頭部和節區,其內容未指定
我們在使用winhex等工具觀察ELF文件的時候,可能會發現節區的位置在節區表的前面,對於這點我們需要理解的是對於PE、或者ELF文件來說,每個部分在文件中的偏移位置並不需要嚴格規定,而只要能通過相應字段的指針進行明確定位就可以了。
例如,對於每個節區來說,在節區頭表中的每一個元素(對應每一個節區)都有偏移字段來表明當前節區的偏移位置,則操作系統的loader就可以明確知道該去哪里取數據
0x4: 節區頭部表 / 段表(Section Heade Table)
ELF文件中有很多各種各樣的段,這個段表(Section Header Table)就是保存這些段的基本屬性的結構,ELF文件的段結構就是由段表決定的,編譯器、鏈接器、裝載器都是依靠段表來定位和訪問各個段的屬性的
包含了描述文件節區的信息,ELF頭部中,e_shoff成員給出從文件頭到節區頭部表格的偏移字節數,e_shnum給出表格中條目數目,e_shentsize 給出每個項目的字節數。從這些信息中可以確切地定位節區的具體位置、長度
和程序頭部表一樣,每一項節區在節區頭部表格中都存在着一項元素與它對應,因此可知,這個節區頭部表格為一連續的空間,每一項元素為一結構體(思考這節開頭的那張節區和節區頭部的示意圖),那么這個結構體的定義如下
typedef struct { /* 1. sh_name(4 bytes): 節區名稱,是"節區頭部字符串表節區"(Section Header String Table Section)的索引。名字是一個NULL結尾的字符串。
所謂"節區頭部字符串表節區",就是一段連續的保存每個節區名字的ascii字符的地址空間 */ Elf32_Word sh_name; /* 2. sh_type(4 bytes): 為節區的內容和語義進行分類 1) SHT_NULL: 0: 此值標志節區頭部是非活動的,沒有對應的節區。此節區頭部中的其他成員取值無意義 2) SHT_PROGBITS: 1: 此節區包含程序定義的信息,其格式和含義都由程序來解釋 3) SHT_SYMTAB: 2: 此節區包含一個符號表。目前目標文件對每種類型的節區都只能包含一個,不過這個限制將來可能發生變化,通常情況下,SHT_SYMTAB節區提供用於鏈接編輯(指ld而言)的符號,盡管也可用來實現動態
鏈接。 4) SHT_STRTAB: 3: 此節區包含字符串表。目標文件可能包含多個字符串表節區。 5) SHT_RELA: 4: 此節區包含重定位表項,其中可能會有補齊內容(addend),例如32位目標文件中的Elf32_Rela類型。目標文件可能擁有多個重定位節區 6) SHT_HASH: 5: 此節區包含符號哈希表。所有參與動態鏈接的目標都必須包含一個符號哈希表。目前,一個目標文件只能包含一個哈希表,不過此限制將來可能會解除。 7) SHT_DYNAMIC: 6: 此節區包含動態鏈接的信息。目前一個目標文件中只能包含一個動態節區,將來可能會取消這一限制。 8) SHT_NOTE: 7: 此節區包含以某種方式來標記文件的信息。 9) SHT_NOBITS: 8: 這種類型的節區不占用文件中的空間,其他方面和SHT_PROGBITS相似。盡管此節區不包含任何字節,成員sh_offset中還是會包含概念性的文件偏移 10) SHT_REL: 9: 此節區包含重定位表項,其中沒有補齊(addends),例如32位目標文件中的Elf32_rel類型。目標文件中可以擁有多個重定位節區 11) SHT_SHLIB: 10: 此節區被保留,不過其語義是未規定的。包含此類型節區的程序與ABI不兼容。 12) SHT_DYNSYM: 11: 作為一個完整的符號表,它可能包含很多對動態鏈接而言不必要的符號。因此,目標文件也可以包含一個SHT_DYNSYM節區,其中保存動態鏈接符號的一個最小集合,以節省空間 13) SHT_LOPROC(0x70000000)~SHT_HIPROC(0x7FFFFFFF): 這一段(包括兩個邊界),是保留給處理器專用語義的 14) SHT_LOUSER(0X80000000): 此值給出保留給應用程序的索引下界 15) SHT_HIUSER(0X8FFFFFFF): 此值給出保留給應用程序的索引上界 */ Elf32_Word sh_type; /* 2. sh_flags(4 bytes): sh_flags字段定義了一個節區中包含的內容是否可以修改、是否可以執行等信息。如果一個標志位被設置,則該位取值為1。未定義的各位都設置為0(這是一種bitmap位圖表示法) 1) SHF_WRITE: 0x1: 節區包含進程執行過程中將可寫的數據 2) SHF_ALLOC: 0x2: 此節區在進程執行過程中占用內存。某些控制節區並不出現於目標文件的內存映像中,對於那些節區,此位應設置為0 3) SHF_EXECINSTR: 0x4: 節區包含可執行的機器指令 4) SHF_MASKPROC: 0xF0000000: 所有包含於此掩碼中的四位都用於處理器專用的語義 */ Elf32_Word sh_flags; /* 3. sh_addr(4 bytes): 如果節區將出現在進程的內存映像中,此成員給出節區的第一個字節應處的位置。否則,此字段為0 */ Elf32_Addr sh_addr; /* 4. sh_offset(4 bytes): 此成員的取值給出節區的第一個字節與文件頭之間的偏移。不過,SHT_NOBITS類型的節區不占用文件的空間,因此其sh_offset成員給出的是其概念性的偏移 */ Elf32_Off sh_offset; /* 5. sh_size(4 bytes): 此成員給出節區的長度(字節數)。除非節區的類型是SHT_NOBITS,否則節區占用文件中的sh_size 字節。類型為SHT_NOBITS的節區長度可能非零,不過卻不占用文件中的空間 */ Elf32_Word sh_size; /* 6. sh_link(4 bytes): 此成員給出節區頭部表索引鏈接。其具體的解釋依賴於節區類型 根據節區類型的不同,sh_link和sh_info 的具體含義也有所不同 sh_type sh_link sh_info SHT_DYNAMIC 此節區中條目所用到的字符串表格的節區頭部索引 0 SHT_HASH 此哈希表所適用的符號表的節區頭部索引 0 SHT_REL、SHT_RELA 相關符號表的節區頭部索引 重定位所適用的節區的節區頭部索引 SHT_SYMTAB、SHT_DYNSYM 相關聯的字符串表的節區頭部索引 最后一個局部符號(綁定 STB_LOCAL)的符號表索引值加一 其它 SHN_UNDEF 0 */ Elf32_Word sh_link; /* 7. sh_info(4 bytes): 此成員給出附加信息,其解釋依賴於節區類型 */ Elf32_Word sh_info; /* 8. sh_addralign(4 bytes): 某些節區帶有地址對齊約束。例如,如果一個節區保存一個doubleword,那么系統必須保證整個節區能夠按雙字對齊。sh_addr對sh_addralign取模,結果必須為0。目前僅允許取值為0和2的冪
次數。數值0和1表示節區沒有對齊約束 */ Elf32_Word sh_addralign; /* 9. sh_entsize(4 bytes): 某些節區中包含固定大小的項目,如符號表。對於這類節區,此成員給出每個表項的長度字節數。如果節區中並不包含固定長度表項的表格,此成員取值為0 */ Elf32_Word sh_entsize; }Elf32_Shdr;
 
根據獲取DT_PLTGOT對應的地址,讀取GOT[1]地址得到進程link_map信息
0x5: 重定位表
重定位表(".rel.text")位於段表之后,它的類型為(sh_type)為"SHT_REL",即重定位表(Relocation Table)
鏈接器在處理目標文件時,必須要對目標文件中某些部位進行重定位,即代碼段和數據段中那些對絕對地址的引用的位置,這些重定位信息都記錄在ELF文件的重定位表里面,對於每個須要重定位的代碼段或者數據段,都會有一個相應的重定位表
一個重定位表同時也是ELF的一個段,這個段的類型(sh_type)就是"SHT_REL"
0x6: 字符串表
ELF文件中用到了很多字符串,比如段名、變量名等。因為字符串的長度往往是不定的,所以用固定的結構來表示比較困難,一種常見的做法是把字符串集中起來存放到一個表,然后使用字符串在表中的偏移來引用字符串
一般字符串表在ELF文件中也以段的形式保存,常見的段名為".strtab"(String Table 字符串表)或者".shstrtab"(Section Header String Table 段字符串表)
1. ".strtab"(String Table 字符串表) 用來保存普通的字符串,比如符號的名字 2. ".shstrtab"(Section Header String Table 段字符串表) 用來保存段表中用到的字符串,最常見的就是段名(sh_name)
Relevant Link:
http://www.cnblogs.com/LittleHann/archive/2013/06/14/3136111.html http://files.cnblogs.com/LittleHann/ELF.pdf http://blog.csdn.net/flydream0/article/details/8719036 《程序員的自我修養 : 第三章》
2. ELF格式分析工具
使用linux下提供的readelf可以很方便的查看和學習ELF文件格式
Usage: readelf <option(s)> elf-file(s) Options are: 1) -a --all: Equivalent to: -h -l -S -s -r -d -V -A -I 2_ -h --file-header: 僅顯示ELF文件頭部(ELF file header) 3) -l --program-headers: 僅顯示ELF程序頭部(program headers) 4) -S --section-headers: 顯示ELF節區頭部(sections' header) 5) -t --section-details: 顯示ELF節區詳細信息(section details) 6) -e --headers: Equivalent to: -h -l -S 7) -s --syms: 顯示ELF文件符號表(symbol table) 8) -r --relocs: 顯示ELF文件重定位表(relocations) 9) -d --dynamic: 顯示ELF文件動態節(rdynamic section) ted bytes
example:
code:
#include <stdio.h> main() { printf("hello\n"); }
ELF Info:
ELF Header: Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 Class: ELF32 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: EXEC (Executable file) Machine: Intel 80386 Version: 0x1 Entry point address: 0x8048300 Start of program headers: 52 (bytes into file) Start of section headers: 1888 (bytes into file) Flags: 0x0 Size of this header: 52 (bytes) Size of program headers: 32 (bytes) Number of program headers: 8 Size of section headers: 40 (bytes) Number of section headers: 30 Section header string table index: 27 Section Headers: [Nr] Name Type Addr Off Size ES Flg Lk Inf Al [ 0] NULL 00000000 000000 000000 00 0 0 0 [ 1] .interp PROGBITS 08048134 000134 000013 00 A 0 0 1 [ 2] .note.ABI-tag NOTE 08048148 000148 000020 00 A 0 0 4 [ 3] .note.gnu.build-i NOTE 08048168 000168 000024 00 A 0 0 4 [ 4] .gnu.hash GNU_HASH 0804818c 00018c 000020 04 A 5 0 4 [ 5] .dynsym DYNSYM 080481ac 0001ac 000050 10 A 6 1 4 [ 6] .dynstr STRTAB 080481fc 0001fc 00004a 00 A 0 0 1 [ 7] .gnu.version VERSYM 08048246 000246 00000a 02 A 5 0 2 [ 8] .gnu.version_r VERNEED 08048250 000250 000020 00 A 6 1 4 [ 9] .rel.dyn REL 08048270 000270 000008 08 A 5 0 4 [10] .rel.plt REL 08048278 000278 000018 08 A 5 12 4 [11] .init PROGBITS 08048290 000290 000030 00 AX 0 0 4 [12] .plt PROGBITS 080482c0 0002c0 000040 04 AX 0 0 4 [13] .text PROGBITS 08048300 000300 00016c 00 AX 0 0 16 [14] .fini PROGBITS 0804846c 00046c 00001c 00 AX 0 0 4 [15] .rodata PROGBITS 08048488 000488 000012 00 A 0 0 4 [16] .eh_frame_hdr PROGBITS 0804849c 00049c 000024 00 A 0 0 4 [17] .eh_frame PROGBITS 080484c0 0004c0 00007c 00 A 0 0 4 [18] .ctors PROGBITS 0804953c 00053c 000008 00 WA 0 0 4 [19] .dtors PROGBITS 08049544 000544 000008 00 WA 0 0 4 [20] .jcr PROGBITS 0804954c 00054c 000004 00 WA 0 0 4 [21] .dynamic DYNAMIC 08049550 000550 0000c8 08 WA 6 0 4 [22] .got PROGBITS 08049618 000618 000004 04 WA 0 0 4 [23] .got.plt PROGBITS 0804961c 00061c 000018 04 WA 0 0 4 [24] .data PROGBITS 08049634 000634 000004 00 WA 0 0 4 [25] .bss NOBITS 08049638 000638 000008 00 WA 0 0 4 [26] .comment PROGBITS 00000000 000638 00002c 01 MS 0 0 1 [27] .shstrtab STRTAB 00000000 000664 0000fc 00 0 0 1 [28] .symtab SYMTAB 00000000 000c10 000410 10 29 45 4 [29] .strtab STRTAB 00000000 001020 0001fa 00 0 0 1 Key to Flags: W (write), A (alloc), X (execute), M (merge), S (strings) I (info), L (link order), G (group), x (unknown) O (extra OS processing required) o (OS specific), p (processor specific) There are no section groups in this file. Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align PHDR 0x000034 0x08048034 0x08048034 0x00100 0x00100 R E 0x4 INTERP 0x000134 0x08048134 0x08048134 0x00013 0x00013 R 0x1 [Requesting program interpreter: /lib/ld-linux.so.2] LOAD 0x000000 0x08048000 0x08048000 0x0053c 0x0053c R E 0x1000 LOAD 0x00053c 0x0804953c 0x0804953c 0x000fc 0x00104 RW 0x1000 DYNAMIC 0x000550 0x08049550 0x08049550 0x000c8 0x000c8 RW 0x4 NOTE 0x000148 0x08048148 0x08048148 0x00044 0x00044 R 0x4 GNU_EH_FRAME 0x00049c 0x0804849c 0x0804849c 0x00024 0x00024 R 0x4 GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4 Section to Segment mapping: Segment Sections... 00 01 .interp 02 .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rel.dyn .rel.plt .init .plt .text .fini .rodata .eh_frame_hdr .eh_frame 03 .ctors .dtors .jcr .dynamic .got .got.plt .data .bss 04 .dynamic 05 .note.ABI-tag .note.gnu.build-id 06 .eh_frame_hdr 07 Dynamic section at offset 0x550 contains 20 entries: Tag Type Name/Value 0x00000001 (NEEDED) Shared library: [libc.so.6] 0x0000000c (INIT) 0x8048290 0x0000000d (FINI) 0x804846c 0x6ffffef5 (GNU_HASH) 0x804818c 0x00000005 (STRTAB) 0x80481fc 0x00000006 (SYMTAB) 0x80481ac 0x0000000a (STRSZ) 74 (bytes) 0x0000000b (SYMENT) 16 (bytes) 0x00000015 (DEBUG) 0x0 0x00000003 (PLTGOT) 0x804961c 0x00000002 (PLTRELSZ) 24 (bytes) 0x00000014 (PLTREL) REL 0x00000017 (JMPREL) 0x8048278 0x00000011 (REL) 0x8048270 0x00000012 (RELSZ) 8 (bytes) 0x00000013 (RELENT) 8 (bytes) 0x6ffffffe (VERNEED) 0x8048250 0x6fffffff (VERNEEDNUM) 1 0x6ffffff0 (VERSYM) 0x8048246 0x00000000 (NULL) 0x0 Relocation section '.rel.dyn' at offset 0x270 contains 1 entries: Offset Info Type Sym.Value Sym. Name 08049618 00000106 R_386_GLOB_DAT 00000000 __gmon_start__ Relocation section '.rel.plt' at offset 0x278 contains 3 entries: Offset Info Type Sym.Value Sym. Name 08049628 00000107 R_386_JUMP_SLOT 00000000 __gmon_start__ 0804962c 00000207 R_386_JUMP_SLOT 00000000 __libc_start_main 08049630 00000307 R_386_JUMP_SLOT 00000000 puts There are no unwind sections in this file. Symbol table '.dynsym' contains 5 entries: Num: Value Size Type Bind Vis Ndx Name 0: 00000000 0 NOTYPE LOCAL DEFAULT UND 1: 00000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__ 2: 00000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@GLIBC_2.0 (2) 3: 00000000 0 FUNC GLOBAL DEFAULT UND puts@GLIBC_2.0 (2) 4: 0804848c 4 OBJECT GLOBAL DEFAULT 15 _IO_stdin_used Symbol table '.symtab' contains 65 entries: Num: Value Size Type Bind Vis Ndx Name 0: 00000000 0 NOTYPE LOCAL DEFAULT UND 1: 08048134 0 SECTION LOCAL DEFAULT 1 2: 08048148 0 SECTION LOCAL DEFAULT 2 3: 08048168 0 SECTION LOCAL DEFAULT 3 4: 0804818c 0 SECTION LOCAL DEFAULT 4 5: 080481ac 0 SECTION LOCAL DEFAULT 5 6: 080481fc 0 SECTION LOCAL DEFAULT 6 7: 08048246 0 SECTION LOCAL DEFAULT 7 8: 08048250 0 SECTION LOCAL DEFAULT 8 9: 08048270 0 SECTION LOCAL DEFAULT 9 10: 08048278 0 SECTION LOCAL DEFAULT 10 11: 08048290 0 SECTION LOCAL DEFAULT 11 12: 080482c0 0 SECTION LOCAL DEFAULT 12 13: 08048300 0 SECTION LOCAL DEFAULT 13 14: 0804846c 0 SECTION LOCAL DEFAULT 14 15: 08048488 0 SECTION LOCAL DEFAULT 15 16: 0804849c 0 SECTION LOCAL DEFAULT 16 17: 080484c0 0 SECTION LOCAL DEFAULT 17 18: 0804953c 0 SECTION LOCAL DEFAULT 18 19: 08049544 0 SECTION LOCAL DEFAULT 19 20: 0804954c 0 SECTION LOCAL DEFAULT 20 21: 08049550 0 SECTION LOCAL DEFAULT 21 22: 08049618 0 SECTION LOCAL DEFAULT 22 23: 0804961c 0 SECTION LOCAL DEFAULT 23 24: 08049634 0 SECTION LOCAL DEFAULT 24 25: 08049638 0 SECTION LOCAL DEFAULT 25 26: 00000000 0 SECTION LOCAL DEFAULT 26 27: 00000000 0 FILE LOCAL DEFAULT ABS crtstuff.c 28: 0804953c 0 OBJECT LOCAL DEFAULT 18 __CTOR_LIST__ 29: 08049544 0 OBJECT LOCAL DEFAULT 19 __DTOR_LIST__ 30: 0804954c 0 OBJECT LOCAL DEFAULT 20 __JCR_LIST__ 31: 08048330 0 FUNC LOCAL DEFAULT 13 __do_global_dtors_aux 32: 08049638 1 OBJECT LOCAL DEFAULT 25 completed.5974 33: 0804963c 4 OBJECT LOCAL DEFAULT 25 dtor_idx.5976 34: 08048390 0 FUNC LOCAL DEFAULT 13 frame_dummy 35: 00000000 0 FILE LOCAL DEFAULT ABS crtstuff.c 36: 08049540 0 OBJECT LOCAL DEFAULT 18 __CTOR_END__ 37: 08048538 0 OBJECT LOCAL DEFAULT 17 __FRAME_END__ 38: 0804954c 0 OBJECT LOCAL DEFAULT 20 __JCR_END__ 39: 08048440 0 FUNC LOCAL DEFAULT 13 __do_global_ctors_aux 40: 00000000 0 FILE LOCAL DEFAULT ABS test.c 41: 0804961c 0 OBJECT LOCAL DEFAULT 23 _GLOBAL_OFFSET_TABLE_ 42: 0804953c 0 NOTYPE LOCAL DEFAULT 18 __init_array_end 43: 0804953c 0 NOTYPE LOCAL DEFAULT 18 __init_array_start 44: 08049550 0 OBJECT LOCAL DEFAULT 21 _DYNAMIC 45: 08049634 0 NOTYPE WEAK DEFAULT 24 data_start 46: 080483d0 5 FUNC GLOBAL DEFAULT 13 __libc_csu_fini 47: 08048300 0 FUNC GLOBAL DEFAULT 13 _start 48: 00000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__ 49: 00000000 0 NOTYPE WEAK DEFAULT UND _Jv_RegisterClasses 50: 08048488 4 OBJECT GLOBAL DEFAULT 15 _fp_hw 51: 0804846c 0 FUNC GLOBAL DEFAULT 14 _fini 52: 00000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@@GLIBC_ 53: 0804848c 4 OBJECT GLOBAL DEFAULT 15 _IO_stdin_used 54: 08049634 0 NOTYPE GLOBAL DEFAULT 24 __data_start 55: 08048490 0 OBJECT GLOBAL HIDDEN 15 __dso_handle 56: 08049548 0 OBJECT GLOBAL HIDDEN 19 __DTOR_END__ 57: 080483e0 90 FUNC GLOBAL DEFAULT 13 __libc_csu_init 58: 08049638 0 NOTYPE GLOBAL DEFAULT ABS __bss_start 59: 08049640 0 NOTYPE GLOBAL DEFAULT ABS _end 60: 00000000 0 FUNC GLOBAL DEFAULT UND puts@@GLIBC_2.0 61: 08049638 0 NOTYPE GLOBAL DEFAULT ABS _edata 62: 0804843a 0 FUNC GLOBAL HIDDEN 13 __i686.get_pc_thunk.bx 63: 080483b4 23 FUNC GLOBAL DEFAULT 13 main 64: 08048290 0 FUNC GLOBAL DEFAULT 11 _init Histogram for `.gnu.hash' bucket list length (total of 2 buckets): Length Number % of total Coverage 0 1 ( 50.0%) 1 1 ( 50.0%) 100.0% Version symbols section '.gnu.version' contains 5 entries: Addr: 0000000008048246 Offset: 0x000246 Link: 5 (.dynsym) 000: 0 (*local*) 0 (*local*) 2 (GLIBC_2.0) 2 (GLIBC_2.0) 004: 1 (*global*) Version needs section '.gnu.version_r' contains 1 entries: Addr: 0x0000000008048250 Offset: 0x000250 Link: 6 (.dynstr) 000000: Version: 1 File: libc.so.6 Cnt: 1 0x0010: Name: GLIBC_2.0 Flags: none Version: 2 Notes at offset 0x00000148 with length 0x00000020: Owner Data size Description GNU 0x00000010 NT_GNU_ABI_TAG (ABI version tag) Notes at offset 0x00000168 with length 0x00000024: Owner Data size Description GNU 0x00000014 NT_GNU_BUILD_ID (unique build ID bitstring)
Copyright (c) 2014 LittleHann All rights reserved
