?? elf.h
字號:
// Name Size Alignment Purpose
// ==== ==== ========= =======
// Elf32_Addr 4 4 Unsigned program address
// Elf32_Half 2 2 Unsigned medium integer
// Elf32_Off 4 4 Unsigned file offset
// Elf32_Sword 4 4 Signed large integer
// Elf32_Word 4 4 Unsigned large integer
// unsigned char 1 1 Unsigned small integer
typedef DWORD Elf32_Addr;
typedef WORD Elf32_Half;
typedef DWORD Elf32_Off;
typedef DWORD Elf32_Sword;
typedef DWORD Elf32_Word;
#define EI_NIDENT 16
// ELF header
typedef struct {
unsigned char e_ident[EI_NIDENT];
Elf32_Half e_type;
// e_type
//
// 該成員確定該object的類型。
//
// Name Value Meaning
// ==== ===== =======
// ET_NONE 0 No file type
// ET_REL 1 Relocatable file
// ET_EXEC 2 Executable file
// ET_DYN 3 Shared object file
// ET_CORE 4 Core file
// ET_LOPROC 0xff00 Processor-specific
// ET_HIPROC 0xffff Processor-specific
Elf32_Half e_machine;
// e_machine
//
// 該成員變量指出了運行該程序需要的體系結構。
//
// Name Value Meaning
// ==== ===== =======
// EM_NONE 0 No machine
// EM_M32 1 AT&T WE 32100
// EM_SPARC 2 SPARC
// EM_386 3 Intel 80386
// EM_68K 4 Motorola 68000
// EM_88K 5 Motorola 88000
// EM_860 7 Intel 80860
// EM_MIPS 8 MIPS RS3000
Elf32_Word e_version;
// e_version
//
// 這個成員確定object文件的版本。
//
// Name Value Meaning
// ==== ===== =======
// EV_NONE 0 Invalid version
// EV_CURRENT 1 Current version
Elf32_Addr e_entry;
// 該成員是系統第一個傳輸控制的虛擬地址,在那啟動進程。
// 假如文件沒有如何關聯的入口點,該成員就保持為 0。
Elf32_Off e_phoff;
// 該成員保持著程序頭表(program header table)在文件中的偏移量(以字節計數)。
// 假如該文件沒有程序頭表的的話,該成員就保持為 0。
Elf32_Off e_shoff;
// 該成員保持著section頭表(section header table)在文件中的偏移量(以字節計數)。
// 假如該文件沒有section頭表的的話,該成員就保持為0。
Elf32_Word e_flags;
// 該成員保存著相關文件的特定處理器標志。
// flag的名字來自于EF_<machine>_<flag>??聪聶C器信息“Machine Information”部分的flag的定義。
Elf32_Half e_ehsize;
// 該成員保存著ELF頭大小(以字節計數)。
Elf32_Half e_phentsize;
// 該成員保存著在文件的程序頭表(program header table)中一個入口的大小
// (以字節計數)。所有的入口都是同樣的大小。
Elf32_Half e_phnum;
// 該成員保存著在程序頭表中入口的個數。
// 因此,e_phentsize和e_phnum的乘機就是表的大小(以字節計數).
// 假如沒有程序頭表(program header table),e_phnum變量為0。
Elf32_Half e_shentsize;
// 該成員保存著section頭的大小(以字節計數)。
// 一個section頭是在section頭表(section header table)的一個入口;
// 所有的入口都是同樣的大小。
Elf32_Half e_shnum;
// 該成員保存著在section header table中的入口數目。
// 因此,e_shentsize和e_shnum的乘積就是section頭表的大小(以字節計數)。
// 假如文件沒有section頭表,e_shnum值為0。
Elf32_Half e_shstrndx;
// 該成員保存著跟section名字字符表相關入口的section頭表(section header table)索引。
// 假如文件中沒有section名字字符表,該變量值為SHN_UNDEF。
// 更詳細的信息 看下面“Sections”和字符串表(“String Table”) 。
} Elf32_Ehdr;
char sz_desc_e_type[][128] = { "No file type",
"Relocatable file",
"Executable file",
"Shared object file",
"Core file"
};
char sz_desc_e_machine[][128] = {"No mach", "AT&T", "SPARC", "80386", "Motorola 68", "Motorola 88", "Unknown", "8086", "MIPS"};
char sz_desc_e_entry[] = "Entry point.";
// Program Header
typedef struct {
Elf32_Word p_type;
// Name Value
// ==== =====
// PT_NULL 0
// PT_LOAD 1
// PT_DYNAMIC 2
// PT_INTERP 3
// PT_NOTE 4
// PT_SHLIB 5
// PT_PHDR 6
// PT_LOPROC 0x70000000
// PT_HIPROC 0x7fffffff
Elf32_Off p_offset;
// 該成員給出了該段的駐留位置相對于文件開始處的偏移。
Elf32_Addr p_vaddr;
// 該成員給出了該段在內存中的首字節地址。
Elf32_Addr p_paddr;
Elf32_Word p_filesz;
// 文件映像中該段的字節數;它可能是 0 。
Elf32_Word p_memsz;
// 內存映像中該段的字節數;它可能是 0 。
Elf32_Word p_flags;
Elf32_Word p_align;
// 該成員給出了該段在內存和文件中排列值。
// 0 和 1 表示不需要排列。否則, p_align 必須為正的 2 的冪,
// 并且 p_vaddr 應當等于 p_offset 模 p_align 。
} Elf32_Phdr;
char sz_desc_p_type[][128] = {"PT_NULL", "PT_LOAD", "PT_DYNAMIC", "PT_INTERP", "PT_NOTE", "PT_SHLIB", "PT_PHDR"};
// Section Header
typedef struct {
Elf32_Word sh_name;
// 該成員指定了這個section的名字。
// 它的值是section報頭字符表section的索引。[看以下的“String Table”], 以NULL空字符結束。
Elf32_Word sh_type;
// Section Types, sh_type
// ---------------------------
// Name Value Description
// ==== ===== ===========
// SHT_NULL 0 該值表明該section頭是無效的;它沒有相關的section。
// SHT_PROGBITS 1 該section保存被程序定義了的一些信息,它的格式和意義取決于程序本身。
// SHT_SYMTAB 2 該sections保存著一個符號表(symbol table)。
// SHT_STRTAB 3 該section保存著一個字符串表。
// SHT_RELA 4 該section保存著具有明確加數的重定位入口。
// SHT_HASH 5 該標號保存著一個標號的哈希(hash)表。
// SHT_DYNAMIC 6 該section保存著動態連接的信息。
// SHT_NOTE 7 該section保存著其他的一些標志文件的信息。
// SHT_NOBITS 8 該類型的section在文件中不占空間,但是類似SHT_PROGBITS。
// SHT_REL 9 該section保存著重定位的入口。
// SHT_SHLIB 10 該section類型保留但語意沒有指明。包含這個類型的section的程序是不符合ABI的。
// SHT_DYNSYM 11 該sections保存著一個符號表(symbol table)。
// SHT_LOPROC 0x70000000 在這范圍之間的值為特定處理器語意保留的。
// SHT_HIPROC 0x7fffffff 在這范圍之間的值為特定處理器語意保留的。
// SHT_LOUSER 0x80000000 該變量為應用程序保留的索引范圍的最小邊界。
// SHT_HIUSER 0xffffffff 該變量為應用程序保留的索引范圍的最大邊界。
Elf32_Word sh_flags;
// Section Attribute Flags, sh_flags
// -----------------------------------
// Name Value Description
// ==== ===== ===========
// SHF_WRITE 0x1 該section包含了在進程執行過程中可被寫的數據。
// SHF_ALLOC 0x2 該section在進程執行過程中占據著內存。
// SHF_EXECINSTR 0x4 該section包含了可執行的機器指令。
// SHF_MASKPROC 0xf0000000 所有的包括在這掩碼中的位為特定處理語意保留的。
Elf32_Addr sh_addr;
// 假如該section將出現在進程的內存映象空間里,該成員給出了一個該section在內存中的位置。否則,該變量為0。
Elf32_Off sh_offset;
// 該成員變量給出了該section的字節偏移量(從文件開始計數)。
Elf32_Word sh_size;
// 該成員給你了section的字節大小。
Elf32_Word sh_link;
// 該成員保存了一個section報頭表的索引連接,它的解釋依靠該section的類型。
// 更多信息參見表"sh_link and sh_info Interpretation"
Elf32_Word sh_info;
// 該成員保存著額外的信息,它的解釋依靠該section的類型。
// sh_link and sh_info Interpretation
// -------------------------------------------------------------------------------
// sh_type sh_link sh_info
// ======= ======= =======
// SHT_DYNAMIC The section header index of 0
// the string table used by
// entries in the section.
// -------------------------------------------------------------------------------
// SHT_HASH The section header index of 0
// the symbol table to which the
// hash table applies.
// -------------------------------------------------------------------------------
// SHT_REL The section header index of The section header index of
// SHT_RELA the associated symbol table. the section to which the
// relocation applies.
// -------------------------------------------------------------------------------
// SHT_SYMTAB The section header index of One greater than the symbol
// -------------------------------------------------------------------------------
// SHT_DYNSYM the associated string table. table index of the last local
// symbol (binding STB_LOCAL).
// -------------------------------------------------------------------------------
// other SHN_UNDEF 0
// -------------------------------------------------------------------------------
Elf32_Word sh_addralign;
// 一些sections有地址對齊的約束。
Elf32_Word sh_entsize;
// 一些sections保存著一張固定大小入口的表,就象符號表。
// 對于這樣一個section來說,該成員給出了每個入口的字節大小。
// 如果該section沒有保存著一張固定大小入口的表,該成員就為0。
} Elf32_Shdr;
char sz_desc_sh_type[][128] = { "SHT_NULL", "SHT_PROGBITS", "SHT_SYMTAB", "SHT_STRTAB",
"SHT_RELA", "SHT_HASH", "SHT_DYNAMIC", "SHT_NOTE",
"SHT_NOBITS", "SHT_REL", "SHT_SHLIB", "SHT_DYNSYM"};
char sz_desc_sh_flags[][128] = {"Unknown", "SHF_WRITE", "SHF_ALLOC", "SHF_WRITE & SHF_ALLOC", "SHF_EXECINSTR",
"SHF_WRITE & SHF_ALLOC", "SHF_ALLOC & SHF_EXECINSTR",
"SHF_WRITE & SHF_ALLOC & SHF_EXECINSTR"};
char sz_desc_sh_addr[] = "Position in Mem.";
char sz_desc_sh_offset[] = "Position in file.";
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -