一、程序头表(program_header_table)
一个可执行文件或共享目标文件的程序头表(program header table)是一个数组,数组中的每一个元素称为“程序头(program header)”,每一个程序头描述了一个“段(segment)”或者一块用于准备执行程序的信息。
在elf header中e_phentsize 和 e_phnum 成员指定了程序头的大小和数量。
每个segment的结构如下:
struct Elf64_Phdr {
Elf64_Word p_type;
Elf64_Word p_flags;
Elf64_Off p_offset;
Elf64_Addr p_vaddr;
Elf64_Addr p_paddr;
Elf64_Xword p_filesz;
Elf64_Xword p_memsz;
Elf64_Xword p_align;
};
1. p_type
描述的段的类型。
#define PT_NULL 0
#define PT_LOAD 1
#define PT_DYNAMIC 2
#define PT_INTERP 3
#define PT_NOTE 4
#define PT_SHLIB 5
#define PT_PHDR 6
#define PT_TLS 7
#define PT_NUM 8
#define PT_LOOS 0x60000000
#define PT_GNU_EH_FRAME 0x6474e550
#define PT_GNU_STACK 0x6474e551
#define PT_GNU_RELRO 0x6474e552
#define PT_GNU_PROPERTY 0x6474e553
#define PT_LOSUNW 0x6ffffffa
#define PT_SUNWBSS 0x6ffffffa
#define PT_SUNWSTACK 0x6ffffffb
#define PT_HISUNW 0x6fffffff
#define PT_HIOS 0x6fffffff
#define PT_LOPROC 0x70000000
#define PT_HIPROC 0x7fffffff
结尾案例会说其中一部分。
2. p_flags
此数据成员给出了本段内容的权限。
标志 | 值 | 权限 | 实际权限 |
PF_None | 0 | 无 | 无 |
PF_Exec | 1 | 可执行 | 可读,可执行 |
PF_Write | 2 | 可写 | 可读,可写,写执行 |
PF_Write_Exec | 3 | 可写,可执行 | 可读,可写,写执行 |
PF_Read | 4 | 可读 | 可读,可执行 |
PF_Read_Exec | 5 | 可读,可执行 | 可读,可执行 |
PF_Read_Write | 6 | 可读,可写 | 可读,可写,写执行 |
PF_Read_Write_Exec |