64位操作系统下,readelf工具查看,hexedit查看二进制文件。
ELF的静态结构
1.elf文件分类
(1)可执行文件
(2)可重定位文件 .o
(3)共享库文件 .so
2.elf文件头
ELF文件头 数据结构(64字节)
struct_name | e_ident | e_type | e_machine | e_version | e_entry | e_phoff | e_shoff | e_flags | e_ehsize | e_phentsize | e_phunm | e_shentsize | e_shnum | e_shstrndx |
字节数 | 16字节 | 2字节 | 2字节 | 4字节 | 8字节 | 8字节 | 8字节 | 4字节 | 2字节 | 2字节 | 2字节 | 2字节 | 2字节 | 2字节 |
含义 | 魔术字 | 文件类型 | 版本号 | 入口地址 | 程序头表偏移 | 节头表偏移 | 标志位 | elf文件头大小 | 程序头表项大小 | 程序头表项数量 | 节头表项大小 | 节头表项数量 | 节名字表项数量 | |
主要取值 | 0 未知 1 重定位 2 可执行 3 共享库 |
0 非法版本 1 当前版本 |
0 |
魔术字 数据结构(16字节)
文件标识 | 文件类型 | 编码格式 | 版本 | 补齐 |
4字节 | 1字节 | 1字节 | 1字节 | 9字节 |
7f 45 4c 46 | 0 非法 1 32位 2 64位 |
0 非法 1 小头端 2 大头端 |
1 | 0 |
3.节(section)
ELF文件包含很多节,每个节含有一个节头。节的基本信息(节头)保存在节头表中,一个节头表项描绘一个节头。
节头表项(节头) 数据结构(64字节)
struct_name |
sh_name
|
sh_type
|
sh_flags
|
sh_addr
|
sh_offset
|
sh_size
|
sh_link
|
sh_info
|
sh_addralign
|
sh_entsize
|
字节数 | 4字节 | 4字节 | 8字节 | 8字节 | 8字节 | 8字节 | 4字节 | 4字节 | 8字节 | 8字节 |
含义 | 节名索引 | 节的类型 | 标志位(属性) | 映射地址 | 本节偏移 | 本节大小 | 地址对齐 | 表项大小 | ||
主要取值 | 0 SHT_NULL 1 SHT_PROGBITS 2 SHT_SYMTAB 3 SHT_STRTAB 4 SHT_RELA 5 SHT_HASH 6 SHT_DYNAMIC 7 SHT_NOTE 8 SHT_NOBITS 9 SHT_REL 10 SHT_SHLIB 11 SHT_DYNSYM |
1 SHF_WRITE 在运行过程中可写 2 SHF_ALLOC 运行过程占用内存 4 SHF_EXECINSTR 内容为指令代码 |
即该节映射地址能被其整除。 | 仅当该节为表时有效,其他为0。 |
主要节类型
NULL |
此值表明本节头是一个无效的节头 。
|
PROGBITS |
此值表明本节所含有的信息是由程序定义的。
|
SYMTAB |
完整的符号表。
|
STRTAB |
此值表明本节是字符串表。
|
RELA |
此值表明本节是一个重定位节。
|
HASH |
此值表明本节包含一张哈希表。
|
DYNAMIC |
此值表明本节包含的是动态连接信息。
|
NOTE |
此值表明本节包含的信息用于以某种方式来标记本文件。
|
NOBITS |
此值表明这一节的内容是空的,并不占用实际的空间。
|
REL |
此值表明本节是一个重定位节。
|
SHLIB |
此值是一个保留值。
|
DYNSYM | 一个较小的符号表,专门用于动态连接。 |
特殊节(常见节)
名字 | 类型 | 标志位 | 说明 |
.bss |
NOBITS
|
WA |
|