以foobar可执行文件为例,详解解释ELF文件格式

以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


你可能感兴趣的:(OO)