前面章節我們瞭解了ELF文件的頭部結構,這次我們深入瞭解另一個非常重要的數據結構,那就是程序表頭。操作系統嚴重依賴該結構來加載ELF文件或是實現動態鏈接。程序表頭反映的是當ELF加載到內存後所形成的“視圖”或結構,也就是說ELF文件存在硬盤上或者被加載到內存,它展現出來的形態不一致。
我們先看程序表頭的數據結構:
typedef struct {
unit32_t p_type; #數據類型
uint332_t p_flags; #標誌位
uint64_t p_offset; #在ELF文件中的偏移
uint64_t p_vaddr; #虛擬地址
uint64_t p_paddr; #物理地址
uint64_t p_fllesz; #在硬盤上的大小
uint64_t p_memsz; #在內存中大小
uint64_t p_align; #內存對齊方式
} Elf64_Phdr;
使用命令 readelf --wide --segments a.out可以讀取程序表頭內容信息:
這裏需要注意的是,程序表頭其實沒有什麼新意,它其實應前面說過的若干個段所形成的集合。接下來我們看每個字段的含義。
p_type對應表頭的類型,常用的數值有PT_LOAD, PT_DYNAMIC, PT_INTER。如果取值PT_LOAD,意味着表頭對應的段需要加裝到內存中