Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> ELF Format 筆記(十一)—— 程序頭結構,elfformat

ELF Format 筆記(十一)—— 程序頭結構,elfformat

編輯:關於android開發

ELF Format 筆記(十一)—— 程序頭結構,elfformat


ilocker:關注 Android 安全(新手) QQ: 2597294287

程序頭表 (program header table) 是一個結構體數組,數組中的每個結構體元素是一個程序頭 (program header),每個程序頭描述一個段 (segment)。

 

一個 so 通常有兩個可加載段 (LOAD) 段,android linker 在加載 so 時會根據 LOAD 段在內存中的最大虛擬地址減去最小虛擬地址,來計算要申請的內存大小。

 

除了兩個 LOAD 段,其他段中的數據也是執行程序所需的,如:動態鏈接需要 DYNAMIC 段,c++ 異常棧展開需要 EXIDX 段。所以其他段也是需要加載到內存的,它們實際就位於兩個 LOAD 段內部。

節 (section) 和段 (segment) 分別是從鏈接視圖和執行視圖兩個不同的角度的來劃分的,它們有一個對應關系 (每個段“包含”一個或者多個節):

 

程序頭結構:

typedef struct {
  Elf32_Word p_type;
  Elf32_Off  p_offset;
  Elf32_Addr p_vaddr;
  Elf32_Addr p_paddr;
  Elf32_Word p_filesz;
  Elf32_Word p_memsz;
  Elf32_Word p_flags;
  Elf32_Word p_align;
} Elf32_Phdr;

  p_type:段類型,如:PT_LOAD (可加載段)、PT_DYNAMIC (動態段)。

  p_offset:段數據的第一個字節相對於文件開頭的偏移量。

  p_vaddr:段數據的第一個字節在內存中的虛擬地址 (只是一個偏移)。

  p_paddr:暫時不用關心。

  p_filesz:段數據在文件中的的字節大小,可以是 0。

  p_memsz:段數據在內存映像中的字節大小,可以是 0。

  p_flags:段內存映像的訪問權限:PF_X (可執行)、PF_W (可寫)、PF_R (可讀)。

  p_align:如果為 0 或 1,表示不需要對齊。否則,p_align 應該是 2 的正整數冪,p_vaddr 和 p_offset 在對 p_align 取模後應相等。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved