目录
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. 以及执行视图(内存中的运行时格式)
下面我们来详细学习一下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程序即可),这样会获得比较直观的感受
程序头部表(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进行对照学习
节区
节区中包含目标文件中的所有信息,除了: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;
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
ELF(Executable and Linkable Format)学习,布布扣,bubuko.com
ELF(Executable and Linkable Format)学习
原文:http://www.cnblogs.com/LittleHann/p/3871092.html