elf文件头信息
- 0x00 - 0x03: 魔数字节
- 0x04: 类(
02表示这是一个 64 位 ELF 文件(01是 32 位)) - 0x05:数据编码(
01表示采用小端存储(Little Endian)) - 0x06:版本(
01表示当前版本) - 0x07:操作系统ABI(
00表示 UNIX 系统 V) - 0x08:ABI版本(
00表示 ABI 的版本号为 0) - 0x09-0x0F:padding
- 0x10-0x11:Type(
01表示这是一个可重定位文件(Relocatable file)) - 0x12-0x13:Machine(
3e表示这是一个 x86-64 架构(Advanced Micro Devices X86-64)) - 0x14-0x17:版本(
01表示当前版本) - 0x18-0x1F:入口点地址(入口点地址是
0x0,即没有指定入口点) - 0x20-0x27:程序头的开始(表示程序头从文件开始处偏移
0x0字节。由于这是一个可重定位文件(REL),所以没有程序头) - 0x28-0x2F:节头的开始(节头从文件偏移
0x9f00字节处开始) - 0x30-0x33:Flags(00表示没有特殊标志)
- 0x34-0x35:ELF文件头大小
- 0x36-0x37:ELF程序头大小
- 0x38-0x39:ELF程序头数目
- 0x3A-0x3B:ELF节头大小
- 0x3C-0x3D:节头数目
- 0x3E-0x3F节头字符串表索引
section header struct
typedef struct {
uint32_t sh_name; // 段的名称索引(相对于字符串表)
uint32_t sh_type; // 段的类型(如 SHT_PROGBITS, SHT_NOBITS)
uint64_t sh_flags; // 段的标志(如 SHF_ALLOC, SHF_EXECINSTR)
uint64_t sh_addr; // 段的虚拟地址(加载时的地址)
uint64_t sh_offset; // 段在文件中的偏移
uint64_t sh_size; // 段的大小
uint32_t sh_link; // 与段相关的链接表索引(例如,对于符号表,该值是字符串表的索引)
uint32_t sh_info; // 与段相关的附加信息
uint64_t sh_addralign; // 段的地址对齐方式
uint64_t sh_entsize; // 如果段包含表格,这个字段是表项的大小
} Elf64_Shdr;
Leave a comment