以foobar可执行文件为例,详解解释ELF文件格式
foobar文件的ELF header。7F454C46表示这是一个ELF文件。
e_type=02 表明它是一个可执行文件
e_machine=03 表明运行该程序需要的体系结构为Intel 80386
e_version 这个成员确定文件的版本
e_entry 程序的入口地址。文件foobar的入口地址为0x80480A0
e_phoff Program Header Table在文件中的偏移量(以字节计数)这里的值为0x34.
e_shoff Section Header Table在文件中的偏移量(以字节计数)。这里的值为0x0190
e_ehsize ELF Header大小(以字节计数)。这里的值为0x34
e_phentsize Program Header Table中一个条目(Program Header Entry)的大小。这里的值为0x20h
e_phnum Program header table中有多少个条目这里有0x03h
e_shentsize Section Header Table中每一个条目(Section Header Entry) 的大小。这里的值为0x28h
e_shnum Section Header Table中有多少个条目,这里有0x06个
e_shstrndx 包含节名称的字符串是第几节(从零开始数),这里值为5,表示第5个节包含节名称。
----------------------------------------------------------------------------------------------------------------------------------
实际上Program header描述的是系统准备程序运行所需要的一个段
foobar程序头表中共有三项(e_phnum=3)偏移分别是:0x34~~0x53,0x54~~0x73,0x74~~0x93,相差20h个字节。
其中各项意义如下:
p_type 当前Program header所描述段的类型
P_offset段的第一个字节在文件中的偏移
p_vaddr段的第一个字节在内存中的虚拟地址
P_paddr在物理地址定位相关的系统中,此项为物理地址保留
p_filesz 段在文件中的长度
p_memsz段在内存中的长度
p_flags 与段相关的标志
p_align 根据此项值来确定段在文件以及内存中如何对齐
Program head0 program header 1 program header2
p_type 0x1 0x1 0x6474E551
p_offset 0x0 0x134 0
p_vaddr 0x8048000 0x8048134 0
p_paddr 0x8048000 0x8048134 0
p_filesz 0x131 0x8 0
p_memsz 0x131 0x8 0
p_flags 0x5 0x6 0x7
p_align 0x1000 0x1000 0x4
看到这些信息,我们知道两个程序段载入内存分别是
8048000h~~~8048131h
8048134h~~~804813Ch