首页 > 其他 > 详细

ELF(Executable and Linkable Format)学习

时间:2014-07-27 22:37:20      阅读:515      评论:0      收藏:0      [点我收藏+]

目录

0. 引言

1. ELF文件格式
2. ELF格式分析工具

 

0. 引言

可执行链接格式(Executable and Linking Format)最初是由UNIX系统实验室(UNIX System Laboratories,USL)开发并发布的,作为应用程序二进制接口(Application Binary Interface,ABI)的一部分。
ELF标准的目的是为软件开发人员提供一组二进制接口定义,这些接口可以延伸到多种操作环境,从而减少重新编码、重新编译程序的需要。接口的内容包括:

1. 目标模块格式
2. 可执行文件格式
3. 调试记录信息与格式等

工具接口标准(Tool Interface Standards,TIS)委员会将还在发展的ELF标准选作为一种可移植的目标文件格式,可以在32位Intel体系结构上的很多操作系统中使用。
TIS给出的Portable Formats Specification 1.1版本中主要针对三种不同类型的目标文件作了规定,并规定了程序加载与动态链接相关过程细节,给出了标准ANSI C和libc例程必须提供的符号。在该组织随后发布的Executable and Linking Format(ELF) Specification 1.2版本中则分如下三个部分,主要的不同点是对与操作系统相关的部分进行了重新组织:

1. Book I: Executable and Linking Format,描述ELF目标文件格式;
2. Book II: Processor Specific(Intel Architecture),描述ELF中与硬件相关的信息;
3. Book III: Operating System Specific,描述ELF中与操作系统相关的部分,例如System V Release 4信息等

 

 

1. ELF文件格式

我们知道,对于windows中使用的PE文件结构来说,也存在一种"磁盘上PE结构"和"内存中PE结构"的概念,原因在于操作系统为了提高CPU的读写效率,会在将磁盘上的PE镜像装载映射到内存中的时候进行"内存页边界对齐"(例如对应32位机器来说就是4KB,不足4KB的用00进行Padding),所以我们在程序动态运行时查看进程的dump会看到大量的00
同样,对于Linux也是一样的,对于ELF格式来说,存在

1. 链接视图(磁盘上的静态格式)
2. 以及执行视图(内存中的运行时格式)

bubuko.com,布布扣bubuko.com,布布扣

 

下面我们来详细学习一下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

无符号小整数

ELF Header

文件开始处是一个ELF头部(ELF Header),用来描述整个文件的组织,这些信息独立于处理器,也独立于文件中的其余内容

#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;

无论是对于网络协议格式、还是文件格式的学习,亲身动手实验永远都是最后的方法,这里,小瀚建议朋友们一边结合一些资料、rfc标准文档、一边自己用winhex来一段一段地对照着看(随便写个hello world程序即可),这样会获得比较直观的感受

bubuko.com,布布扣

程序头部表(Program Header Table)
告诉系统如何创建进程映像。用来构造进程映像的目标文件必须具有程序头部表,可重定位文件不需要这个表。
可执行文件或者共享目标文件的程序头部的大致结构如下:

1. 结构数组
每个数组元素表示:
    1) 一个""
        1.1) 包含一个或者多个"节区"
    程序头部仅对于可执行文件和共享目标文件有意义
    2) 或者"系统准备程序执行所必需的其它信息"

可执行目标文件在ELF头部的e_phentsize和e_phnum成员中给出其自身程序头部的大小以及元素数量

bubuko.com,布布扣

我们知道,程序头部表(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;

bubuko.com,布布扣

bubuko.com,布布扣

通过readelf和winhex进行对照学习

节区

节区中包含目标文件中的所有信息,除了:ELF头部、程序头部表格、节区头部表格
节区满足以下条件:

1. 目标文件中的每个节区都有对应的节区头部描述它,反过来,有节区头部不意味着有节区
2. 每个节区占用文件中一个连续字节区域(这个区域可能长度为0)
3. 文件中的节区不能重叠,不允许一个字节存在于两个节区中的情况发生
4. 目标文件中可能包含非活动空间(INACTIVE SPACE)。这些区域不属于任何头部和节区,其内容未指定

我们在使用winhex等工具观察ELF文件的时候,可能会发现节区的位置在节区表的前面,对于这点我们需要理解的是对于PE、或者ELF文件来说,每个部分在文件中的偏移位置并不需要严格规定,而只要能通过相应字段的指针进行明确定位就可以了。

例如,对于每个节区来说,在节区头表中的每一个元素(对应每一个节区)都有偏移字段来表明当前节区的偏移位置,则操作系统的loader就可以明确知道该去哪里取数据

节区头部表(Section Heade Table)

包含了描述文件节区的信息,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;

 bubuko.com,布布扣

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:                              2s 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

 

ELF(Executable and Linkable Format)学习,布布扣,bubuko.com

ELF(Executable and Linkable Format)学习

原文:http://www.cnblogs.com/LittleHann/p/3871092.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!