Can you summarize the following document?
        
  

  

  MS-DOS頭和MS-DOS Stub只存在於映像檔案中。在MS-DOS下執行該應用程式,預設的Stub會列印出訊息"This program cannot be run in DOS mode"。 MS-DOS頭的偏移位置0x3C處包括指向PE簽名的檔案指標,用於定位PE的開始位置。

  PE簽名是一個4位元組的項:字元P和E,隨後是2個空位元組。  在Winnt.h中定義的標準COFF頭的結構_IMAGE_FILE_HEADER

  Object檔案不含這部分,所以稱為“可選頭”。  在Winnt.h中定義的optional header的結構_IMAGE_OPTIONAL_HEADER

  節(section)是PE檔案中儲存資料的劃分。通常,載入到記憶體後,同一節的資料具有相同的記憶體訪問屬性(可讀/可寫/可執行等)。  節表緊隨檔案頭部。由於沒有檔案頭具有直接指向節表的指標,所以節表的位置被計算為檔案頭的大小再加上1。  COFF頭的NumberOfSections欄位,定義了節表中節的數量。在節頭表中,節的索引是基於1,並且節的順序是由連結器確定。節按照節表中定義的順序連續存放,起始RVA根據PE頭的SectionAlignment欄位值進行對齊。  節頭是一個定義在Winnt.h中的40位元組的結構IMAGE_SECTION_HEADER:  常見的節:

  COFF File Header中的欄位PointerToSymbolTable給出了符號表地址,欄位NumberOfSymbols給出了符號表條目數量。對於映象檔案,COFF除錯資訊是過時的,因此該欄位為空。  typedef struct { } SYMENT;  符號表包含了所有符號與元符號的條目。

  字串表儲存長度大於8的符號。字串表緊隨符號表。首先讀出4個位元組,為符號表的位元組長度。隨後的4個位元組總為0。到符號表的引用地址總是從這4個0位元組開始。示例程式碼如下:

  typedef struct { } LINENO; 每個可執行的節有自己的行號表. 節中的每個函式獨立編號,函式的首行(有左花括號的行)編號為1. 每個函式在行號表中有一個條目, 其l_lnno為0, l_symndx為符號表中該函式. 其後是該函式每一行的條目, l_lnno甚至為該函式內的行號(1..N), l_paddr設定為該行的第一條彙編程式碼的地址.  為得到絕對行號, 需要在符號表中找到該函式的"beginning of function" symbol (型別C_FCN)為該函式的絕對行號,然後加上函式內的相對行號.
可移植性可執行檔案(英語:Portable Executable,縮寫為PE)是一種用於可執行檔案、目標檔案和動態連結庫的檔案格式,主要使用在32位和64位的Windows作業系統上。“可移植的”是指該檔案格式的通用性,可用於許多種不同的作業系統和體系結構中。PE檔案格式封裝了Windows作業系統載入可執行程式程式碼時所必需的一些資訊。這些資訊包括動態連結庫、API匯入和匯出表、資源管理資料和執行緒區域性儲存資料。在Windows NT作業系統中,PE檔案格式主要用於EXE檔案、DLL檔案、.sys(驅動程式)和其他檔案型別。可擴充套件韌體介面(EFI)技術規範書中說明PE格式是EFI環境中的標準可執行檔案格式。開頭為DOS頭部。