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:
《程序员的自我修养 : 第三章》
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