ELF(Executable and Linkable Format)


目錄

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM