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

 

转载于:https://www.cnblogs.com/LittleHann/p/3871092.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值