从Linking View可以看出,ELF文件由4部分组成:ELF header(ELF头), 程序头表(Program header table), 节(Sections)和节头表(Section header table)。实际上,一个文件中不一定包含全部这些内容,而且它们的位置也未必这样安排。只有ELF头的位置是固定的,其余各部分的位置、大小等信息由ELF头中的各项值来决定。
ELF header的格式如图:
#define EI_NIDENT 16
typedef struct {
unsigned char e_ident[EI_NIDENT];
Elf32_Half e_type;
Elf32_Half e_machine;
Elf32_Word e_version;
Elf32_Addr e_entry;
Elf32_Off e_phoff;
Elf32_Off e_shoff;
Elf32_Word e_flags;
Elf32_Half e_ehsize;
Elf32_Half e_phentsize;
Elf32_Half e_phnum;
Elf32_Half e_shentsize;
Elf32_Half e_shnum;
Elf32_Half e_shstrndx;
} Elf32_Ehdr;
typedef struct {
unsigned char e_ident[EI_NIDENT];
Elf64_Half e_type;
Elf64_Half e_machine;
Elf64_Word e_version;
Elf64_Addr e_entry;
Elf64_Off e_phoff;
Elf64_Off e_shoff;
Elf64_Word e_flags;
Elf64_Half e_ehsize;
Elf64_Half e_phentsize;
Elf64_Half e_phnum;
Elf64_Half e_shentsize;
Elf64_Half e_shnum;
Elf64_Half e_shstrndx;
} Elf64_Ehdr;
这里我拿了一个32位的elf文件。用Winhex打开,如图,这就是ELF header。
这里指的34是e_phoff成员——Program header table 在文件中的偏移量。同理,我们可以得到e_shnum(Program header table中的条目) = 3
我们看到,Program header table在文件中的偏移量位0x34,而ELFheader大小也是0x34,可见ELF header后面紧接着就是Program header table。
Program header的数据结构:
typedef struct {
Elf32_Word p_type;
Elf32_Off p_offset;
5 Elf32_Addr p_vaddr;
Elf32_Addr p_paddr;
Elf32_Word p_filesz;
Elf32_Word p_memsz;
Elf32_Word p_flags;
10 Elf32_Word p_align;
}
这些相关成员可以在碰到的时候再研究,总之Program header描述的是一个段在文件中的位置、大小以及它被放进内存后所在的位置和大小。