日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

elf是什么意思 elf是什么意思英語(yǔ)( 二 )


*.o*.soe_entry 是程序的入口虛擬地址 , 注意不是main函數(shù)的地址,而是 .text 段的首地址 _start。當(dāng)然這也要求程序本身非PIE( -no-pie )編譯的且ASLR關(guān)閉的情況下,對(duì)于非 ET_EXEC 類型通常并不是實(shí)際的虛擬地址值 。
其他的字段大多數(shù)是指定Section Header( e_sh )和Program Header( e_ph )的信息 。Section/Program Header Table本身可以看做是數(shù)組結(jié)構(gòu),ELF頭中的信息指定對(duì)應(yīng)Table數(shù)組的位置、長(zhǎng)度、元素大小信息 。最后一個(gè) e_shstrndx 表示的是section table中的第 e_shstrndx 項(xiàng)元素,保存了所有section table名稱的字符串信息 。
Section Header上節(jié)說(shuō)了section header table是一個(gè)數(shù)組結(jié)構(gòu),這個(gè)數(shù)組的位置在 e_shoff 處,共有 e_shnum 個(gè)元素(即section),每個(gè)元素的大小為 e_shentsize 字節(jié) 。每個(gè)元素的結(jié)構(gòu)如下:
typedef struct{Elf32_Word sh_name;/* Section name (string tbl index) */Elf32_Word sh_type;/* Section type */Elf32_Word sh_flags;/* Section flags */Elf32_Addr sh_addr;/* Section virtual addr at execution */Elf32_Off sh_offset;/* Section file offset */Elf32_Word sh_size;/* Section size in bytes */Elf32_Word sh_link;/* Link to another section */Elf32_Word sh_info;/* Additional section information */Elf32_Word sh_addralign;/* Section alignment */Elf32_Word sh_entsize;/* Entry size if section holds table */} Elf32_Shdr;其中 sh_name 是該section的名稱,用一個(gè)word表示其在字符表中的偏移 , 字符串表(.shstrtab)就是上面說(shuō)到的第 e_shstrndx 個(gè)元素 。ELF文件中經(jīng)常使用這種偏移表示方式,可以方便組織不同區(qū)段之間的引用 。
sh_type 表示本section的類型,SPEC中定義了幾十個(gè)類型,列舉其中一些如下:
SHT_NULL: 表示該section無(wú)效,通常第0個(gè)section為該類型SHT_PROGBITS: 表示該section包含由程序決定的內(nèi)容 , 如 .text 、 .data 、 .plt 、 .gotSHT_SYMTAB/SHT_DYNSYM: 表示該section中包含符號(hào)表,如 .symtab 、 .dynsymSHT_DYNAMIC: 表示該section中包含動(dòng)態(tài)鏈接階段所需要的信息SHT_STRTAB: 表示該section中包含字符串信息 , 如 .strtab 、 .shstrtabSHT_REL/SHT_RELA: 包含重定向項(xiàng)信息雖然每個(gè)section header的大小一樣(e_shentsize字節(jié)),但不同類型的section有不同的內(nèi)容,內(nèi)容部分由這幾個(gè)字段表示:
sh_offset: 內(nèi)容起始地址相對(duì)于文件開(kāi)頭的偏移sh_size: 內(nèi)容的大小sh_entsize: 有的內(nèi)容是也是一個(gè)數(shù)組 , 這個(gè)字段就表示數(shù)組的元素大小與運(yùn)行時(shí)信息相關(guān)的字段為:
sh_addr: 如果該section需要在運(yùn)行時(shí)加載到虛擬內(nèi)存中,該字段就是對(duì)應(yīng)section內(nèi)容(第一個(gè)字節(jié))的虛擬地址sh_addralign: 內(nèi)容地址的對(duì)齊,如果有的話需要滿足 sh_addr % sh_addralign = 0sh_flags: 表示所映射內(nèi)容的權(quán)限,可根據(jù) SHF_WRITE/ALLOC/EXECINSTR 進(jìn)行組合另外兩個(gè)字段 sh_link 和 sh_info 的含義根據(jù)section類型的不同而不同,如下表所示:

至于不同類型的section,有的是保存符號(hào)表,有的是保存字符串,這也是ELF表現(xiàn)出拓展性和復(fù)雜性的地方,因此需要在遇到具體問(wèn)題的時(shí)候查看文檔去進(jìn)行具體分析 。
Program Headerprogram header table用來(lái)保存程序加載到內(nèi)存中所需要的信息,使用段(segment)來(lái)表示 。與section header table類似,同樣是數(shù)組結(jié)構(gòu) 。數(shù)組的位置在偏移 e_phoff 處 , 每個(gè)元素(segment header)的大小為 e_phentsize,共有 e_phnum 個(gè)元素 。單個(gè)segment header的結(jié)構(gòu)如下:
typedef struct{Elf32_Word p_type;/* Segment type */Elf32_Off p_offset;/* Segment file offset */Elf32_Addr p_vaddr;/* Segment virtual address */Elf32_Addr p_paddr;/* Segment physical address */Elf32_Word p_filesz;/* Segment size in file */Elf32_Word p_memsz;/* Segment size in memory */Elf32_Word p_flags;/* Segment flags */Elf32_Word p_align;/* Segment alignment */} Elf32_Phdr;既然program header的作用是提供用于初始化程序進(jìn)程的段信息,那么下面這些字段就是很直觀的:

推薦閱讀