版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
PKU/SSDB-03-TN-005JBEOS-TN-03-00520035月ELF文件格式分析類(lèi)操作系統(tǒng)中普遍采用的目標(biāo)文件格式ELF(ExecutableandLinkableForat,目的是研究操作系統(tǒng)中二進(jìn)制級(jí)軟件構(gòu)件的靜態(tài)、動(dòng)態(tài)組裝技術(shù)。ELFC語(yǔ)言程序,分析編譯、鏈接后生成的可重定位、可執(zhí)行格式實(shí)例。關(guān)鍵詞 操作系統(tǒng)編譯鏈接目標(biāo)文件軟件構(gòu)件目 錄簡(jiǎn)介 1相關(guān)標(biāo)準(zhǔn) 1SYSTEMVABI 1LSB 2ELF文件格式 2簡(jiǎn)介 2目標(biāo)文件中的數(shù)據(jù)表示 2目標(biāo)文件格式 3ELFHEADER部分 3節(jié)區(qū)(SECTIONS) 6節(jié)區(qū)頭部表格 6節(jié)區(qū)頭部 7特殊節(jié)區(qū) 10字符串表(STRING12符號(hào)表(SYMBOL13關(guān)于st_info的說(shuō)明 13符號(hào)類(lèi)型 14特殊的節(jié)區(qū)索引 15STN_UNDEF符號(hào) 15符號(hào)取值 15重定位信息 16重定位表項(xiàng) 16重定位類(lèi)型 17程序加載和動(dòng)態(tài)鏈接 19程序頭部(ProgramHeader) 19程序加載 21動(dòng)態(tài)鏈接 23全局偏移表(GOT) 27過(guò)程鏈接表28哈希表(Hash30初始化和終止函數(shù) 313.9 C庫(kù) 31關(guān)于C庫(kù)函數(shù) 31全局?jǐn)?shù)據(jù)符號(hào) 33圖形目錄圖1目標(biāo)文件格式 3圖2 ELFHeader數(shù)據(jù)結(jié)構(gòu) 3圖3節(jié)區(qū)頭部數(shù)據(jù)結(jié)構(gòu) 7圖4符號(hào)表項(xiàng)格式定義 13圖5符號(hào)表項(xiàng)的st_info字段合成 13圖6重定位表項(xiàng)的格式 16圖7程序頭部數(shù)據(jù)結(jié)構(gòu) 19圖8注釋節(jié)區(qū)示例 21圖9可執(zhí)行文件布局示例 22圖10動(dòng)態(tài)節(jié)區(qū)符號(hào)結(jié)構(gòu) 24圖絕對(duì)過(guò)程鏈接表 28圖12位置獨(dú)立的過(guò)程鏈接表 29圖13符號(hào)哈希表的組織 302003520035月PKU/SSDB-03-TR-005?北京大學(xué)信息科學(xué)技術(shù)學(xué)院操作系統(tǒng)實(shí)驗(yàn)室第PAGE?北京大學(xué)信息科學(xué)技術(shù)學(xué)院操作系統(tǒng)實(shí)驗(yàn)室第1頁(yè)共38頁(yè)簡(jiǎn)介(ExecutableandLinkingFormaX(UNIXSystem(ApplicationBinaryInterface,ABI)的一部分。工具接口標(biāo)準(zhǔn)InterfaceStandards,TIS)委員會(huì)將還ELF32Intel體系結(jié)構(gòu)上的很多操作系統(tǒng)中使用[1,2]。ELF式、可執(zhí)行文件格式以及調(diào)試記錄信息與格式等。TISPortableFormatsSpecification1.1版本中主要針對(duì)三種不同類(lèi)型的目標(biāo)ANSIClibc例程必須提供的符號(hào)[1]。在該組織隨后發(fā)布的ExecutableandLinkingFormat(ELF)Specification1.2行了重新組織:BookI:ExecutableandLinkingFormatELF目標(biāo)文件格式;BookII:ProcessorSpecific(IntelArchitecture)ELF中與硬件相關(guān)的信息;BookIII:OperatingSystemSpecificELF中與操作系統(tǒng)相關(guān)的部分,例如SystemVRelease4信息等。相關(guān)標(biāo)準(zhǔn)SystemVABISystemVApplicationBinaryInterface(ABI)接口,使得這些程序能夠運(yùn)行在符合X/OpenCommenApplicationEnvironmentSpecification,Issue4.2SystemVInterfaceDefinition,FourthEdition的操作系統(tǒng)上。二ABI并不是只有一個(gè)規(guī)范,而是一個(gè)規(guī)范體系。SystemVABISystemV在所有硬件平臺(tái)上都一致的接口[3];一個(gè)處理器相關(guān)的部分,描述特定于某個(gè)處理器體系結(jié)構(gòu)的具體實(shí)現(xiàn)[4]。SystemVABI的主要參考標(biāo)準(zhǔn)包括:目標(biāo)系統(tǒng)處理器的體系結(jié)構(gòu)手冊(cè)SystemVInterfaceDefinition(接口定義),4版IEEEPOSIX1003.1-1990標(biāo)準(zhǔn)操作系統(tǒng)規(guī)范X/OpenCommonApplicationEnvironmentSpecification(CAE),Issue4.2InternationalISO/IEC9899:1990(E),ProgrammingLanguages–C,12/15/90.XWindowSystem?XRelease5,圖形用戶界面規(guī)范LSB由于我們所關(guān)心的主要是Linux平臺(tái)上目標(biāo)文件的格式,所以Linux標(biāo)準(zhǔn)LSB(LinuxStandardBase)LSBLinux發(fā)布版本之ABI類(lèi)似,也由兩個(gè)部分組成:gLSB(GenericLSB)適用于所有體系結(jié)構(gòu)archLSB(ArchitectureLSB)LSB目前,LSB由SourceForge開(kāi)放源碼項(xiàng)目社區(qū)提供支持。ELF文件格式簡(jiǎn)介目標(biāo)文件有三種類(lèi)型:(RelocatableFile)包含適合于與其他目標(biāo)文件鏈接來(lái)創(chuàng)建可執(zhí)行文件或者共享目標(biāo)文件的代碼和數(shù)據(jù)??蓤?zhí)行文件(ExecutableFile)包含適合于執(zhí)行的一個(gè)程序,此文件規(guī)定了exec()(SharedObjectFile)包含可在兩種上下文中鏈接的代碼和數(shù)生成另外一個(gè)目標(biāo)文件。其次,動(dòng)態(tài)鏈接器(DynamicLinker)可能將它與某個(gè)可執(zhí)行文件以及其它共享目標(biāo)一起組合,創(chuàng)建進(jìn)程映像。目標(biāo)文件全部是程序的二進(jìn)制表示,目的是直接在某種處理器上直接執(zhí)行。3.1.1目標(biāo)文件中的數(shù)據(jù)表示8位字節(jié)/32器上創(chuàng)建。表1ELF中常用數(shù)據(jù)格式名稱(chēng)大小對(duì)齊目的Elf32_Addr44無(wú)符號(hào)程序地址Elf32_Half22無(wú)符號(hào)中等整數(shù)Elf32_Off44無(wú)符號(hào)文件偏移Elf32_SWord44有符號(hào)大整數(shù)Elf32_Word44無(wú)符號(hào)大整數(shù)unsignedchar11無(wú)符號(hào)小整數(shù)目標(biāo)文件中的所有數(shù)據(jù)結(jié)構(gòu)都遵從“自然”44文件內(nèi)部。目標(biāo)文件格式格式提供了兩種并行視圖,分別反映了這些活動(dòng)的不同需求。圖1目標(biāo)文件格式鏈接視圖 執(zhí)行視圖ELF頭部ELF頭部程序頭部表(可選)程序頭部表節(jié)區(qū)1段1...節(jié)區(qū)n段2節(jié)區(qū)頭部表節(jié)區(qū)頭部表(可選)文件開(kāi)始處是一個(gè)ELF頭部(ELFHeader,用來(lái)描述整個(gè)文件的組織。節(jié)區(qū)部分包含鏈接視圖的大量信息:指令、數(shù)據(jù)、符號(hào)表、重定位信息等等。(ProgramHeaderabl注意:盡管圖中顯示的各個(gè)組成部分是有順序的,實(shí)際上除了ELF頭部表以外,其他節(jié)區(qū)和段都沒(méi)有規(guī)定的順序節(jié)區(qū)頭部表(SectionHeade注意:盡管圖中顯示的各個(gè)組成部分是有順序的,實(shí)際上除了ELF頭部表以外,其他節(jié)區(qū)和段都沒(méi)有規(guī)定的順序ELFHeader部分獨(dú)立于文件中的其余內(nèi)容。ELFHeader部分可以用下圖中的數(shù)據(jù)結(jié)構(gòu)表示:圖2 ELFHeader數(shù)據(jù)結(jié)構(gòu)#defineEI_NIDENT16typedefstruct{#defineEI_NIDENT16typedefstruct{unsignedchar Elf32_Half e_type;Elf32_Half Elf32_Word Elf32_Addr e_entry;Elf32_Off e_phoff;Elf32_Off e_shoff;Elf32_WordElf32_Word e_flags;Elf32_Half e_ehsize;Elf32_Half Elf32_Half e_phnum;Elf32_Half Elf32_Half e_shnum;Elf32_Half e_shstrndx;}Elf32_Ehdr;e_ident數(shù)組給出了F2所示:表2e_ident[]標(biāo)識(shí)索引名稱(chēng)取值目的EI_MAG00文件標(biāo)識(shí)EI_MAG11文件標(biāo)識(shí)EI_MAG22文件標(biāo)識(shí)EI_MAG33文件標(biāo)識(shí)EI_CLASS4文件類(lèi)EI_DATA5數(shù)據(jù)編碼EI_VERSION6文件版本EI_PAD7補(bǔ)齊字節(jié)開(kāi)始處EI_NIDENT16e_ident[]大小這些索引訪問(wèn)包含以下數(shù)值的字節(jié):表3e_ident[]的內(nèi)容說(shuō)明索引說(shuō)明EI_MAG0到EI_MAG3魔數(shù)(MagicNube,標(biāo)志此文件是一個(gè)ELF標(biāo)文件。名稱(chēng) 取值 位置EI_MAG00x7fe_ident[EI_MAG0]EI_MAG1'E'e_ident[EI_MAG1]EI_MAG2'L'e_ident[EI_MAG2]EI_MAG3'F'e_ident[EI_MAG3]EI_CLASS標(biāo)識(shí)文件的類(lèi)別,或者說(shuō),容量名稱(chēng) 取值位置ELFCLASSNONE0 非法類(lèi)別ELFCLASS32 1 32位目標(biāo)ELFCLASS64 2 64位目標(biāo)ELFCLASS324GB。ELFCLASS6464位預(yù)64位定義。EI_DATA字節(jié)e_ident[EI_DATA]給出處理器特定數(shù)據(jù)的數(shù)據(jù)編碼方式。名稱(chēng) 取值位置0 非法數(shù)據(jù)編碼1 高位在前2 低位在前EI_VERSIONELF頭部的版本號(hào)碼,不前此值必須是EV_CURRENT。EI_PADe_ident中未使用字節(jié)的開(kāi)始。初始化為0。32Intel體系結(jié)構(gòu)上要求:132Intel體系結(jié)構(gòu)上要求:1、標(biāo)志2、處理器標(biāo)識(shí)(e_machine)成員必須是EM_386。位置取值e_ident[EI_CLASS]ELFCLASS32e_ident[EI_DATA]ELFDATA2LSBELFHeader4:表4ELFHeader中各個(gè)字段的含義成員說(shuō)明e_ident目標(biāo)文件標(biāo)識(shí)e_type目標(biāo)文件類(lèi)型:名稱(chēng) 取值 含義ET_NONE 0 未知目標(biāo)文件格式ET_REL 1 可重定位文件ET_EXEC 2 可執(zhí)行文件ET_DYN 3 共享目標(biāo)文件ET_CORE 4 Core文件(轉(zhuǎn)儲(chǔ)格式ET_LOPROC 0xff00 特定處理器文件ET_HIPROC 特定處理器文件ET_LOPROC和ET_HIPROC之間的取值用來(lái)標(biāo)識(shí)與處理器相關(guān)的文件格式。e_machine給出文件的目標(biāo)體系結(jié)構(gòu)類(lèi)名稱(chēng) 取值含義EM_NONE0 未指定EM_M32 1 WE321002 EM_386 3 Intel80386EM_68K 4 Motorola68000EM_88K 5 Motorola88000EM_860 7 Intel80860EM_MIPS 8 MIPSELF名稱(chēng)會(huì)使用機(jī)器名來(lái)進(jìn)行區(qū)分。e_version目標(biāo)文件版本名稱(chēng) 取值含義EV_NONE 0 非法版本EV_CURRENT1 當(dāng)前版本e_entry程序入口的虛擬地址。如果目標(biāo)文件沒(méi)有程序入口,可以為0。e_phoff程序頭部表格(ProgramHeader的偏移量(按字節(jié)計(jì)算。如果文件沒(méi)有程序頭部表格,可以為0。e_shoff(SectionHeader(按字節(jié)計(jì)算沒(méi)有節(jié)區(qū)頭部表格,可以為0。e_flagsEF_machine_flag的格式。e_ehsizeELF頭部的大?。ㄒ宰止?jié)計(jì)算。e_phentsize程序頭部表格的表項(xiàng)大小(按字節(jié)計(jì)算。e_phnum程序頭部表格的表項(xiàng)數(shù)目??梢詾?。e_shentsize節(jié)區(qū)頭部表格的表項(xiàng)大?。ò醋止?jié)計(jì)算。e_shnum節(jié)區(qū)頭部表格的表項(xiàng)數(shù)目??梢詾?。e_shstrndx節(jié)區(qū)頭部表格中與節(jié)區(qū)名稱(chēng)字符串表相關(guān)的表項(xiàng)的索引。如果文件沒(méi)有節(jié)區(qū)名稱(chēng)字符串表,此參數(shù)可以為SHN_UNDEF。節(jié)區(qū)(Sections)節(jié)區(qū)中包含目標(biāo)文件中的所有信息,除了:ELF頭部、程序頭部表格、節(jié)區(qū)頭部表格。節(jié)區(qū)滿足以下條件:味著有節(jié)區(qū)。每個(gè)節(jié)區(qū)占用文件中一個(gè)連續(xù)字節(jié)區(qū)域(這個(gè)區(qū)域可能長(zhǎng)度為0。文件中的節(jié)區(qū)不能重疊,不允許一個(gè)字節(jié)存在于兩個(gè)節(jié)區(qū)中的情況發(fā)生。目標(biāo)文件中可能包含非活動(dòng)空間(EE。這些區(qū)域不屬于任何頭部和節(jié)區(qū),其內(nèi)容未指定。節(jié)區(qū)頭部表格ELF頭部中,e_shoff成員給出從文件頭到節(jié)區(qū)頭部表格的偏移字節(jié)數(shù);e_shnum節(jié)區(qū)頭部表格中比較特殊的幾個(gè)下標(biāo)如下:表5節(jié)區(qū)頭部表格中的特殊下標(biāo)名稱(chēng)取值說(shuō)明SHN_UNDEF0標(biāo)記未定義的、缺失的、不相關(guān)的,或者沒(méi)有含義的節(jié)區(qū)引用SHN_LORESERVEOXFF00保留索引的下界SHN_LOPROC0XFF00保留給處理器特殊的語(yǔ)義SHN_HIPROC0XFF1FSHN_ABSOXFFF1包含對(duì)應(yīng)引用量的絕對(duì)取值。這些值不會(huì)被重定位所影響SHN_COMMONOXFFF2相對(duì)于此節(jié)區(qū)定義的符號(hào)是公共符號(hào)。如FORTRANCOMMONC外部變量。SHN_HIRESERVE0XFFFF保留索引的上界SHN_HIRESERVE之間的表項(xiàng)不會(huì)出現(xiàn)在節(jié)區(qū)頭部表中。節(jié)區(qū)頭部每個(gè)節(jié)區(qū)頭部可以用如下數(shù)據(jù)結(jié)構(gòu)描述:圖3節(jié)區(qū)頭部數(shù)據(jù)結(jié)構(gòu)typedefstruct{Elf32_Wordsh_name;Elf32_Wordsh_type;Elf32_Wordsh_flags;Elf32_Addrsh_addr;Elf32_Offtypedefstruct{Elf32_Wordsh_name;Elf32_Wordsh_type;Elf32_Wordsh_flags;Elf32_Addrsh_addr;Elf32_Off Elf32_Wordsh_size;Elf32_Wordsh_link;Elf32_Wordsh_info;Elf32_Wordsh_addralign;Elf32_Wordsh_entsize;}Elf32_Shdr;對(duì)其中各個(gè)字段的解釋如下:表6節(jié)區(qū)頭部字段說(shuō)明成員說(shuō)明sh_name給出節(jié)區(qū)名稱(chēng)。是節(jié)區(qū)頭部字符串表節(jié)區(qū)(SectionHeaderStringTableSection)的索引。名字是一個(gè)NULL結(jié)尾的字符串。sh_type為節(jié)區(qū)的內(nèi)容和語(yǔ)義進(jìn)行分類(lèi)。參見(jiàn)節(jié)區(qū)類(lèi)型。sh_flags1位形式的標(biāo)志,這些標(biāo)志描述了多種屬性。sh_addr如果節(jié)區(qū)將出現(xiàn)在進(jìn)程的內(nèi)存映像中,此成員給出節(jié)區(qū)的第一個(gè)字節(jié)應(yīng)處的位置。否則,此字段為0。sh_offset此成員的取值給出節(jié)區(qū)的第一個(gè)字節(jié)與文件頭之間的偏移。不過(guò),SHT_NOBITSsh_offset成員給出的是其概念性的偏移。sh_size此成員給出節(jié)區(qū)的長(zhǎng)度(字節(jié)數(shù)。除非節(jié)區(qū)的類(lèi)型是SHT_NOBITS,否則節(jié)區(qū)占用文件中的sh_size字節(jié)。類(lèi)型為SHT_NOBITSsh_link此成員給出節(jié)區(qū)頭部表索引鏈接。其具體的解釋依賴(lài)于節(jié)區(qū)類(lèi)型。sh_info此成員給出附加信息,其解釋依賴(lài)于節(jié)區(qū)類(lèi)型。sh_addralign某些節(jié)區(qū)帶有地址對(duì)齊約束。例如,如果一個(gè)節(jié)區(qū)保存一個(gè)doubleword,那么系統(tǒng)必須保證整個(gè)節(jié)區(qū)能夠按雙字對(duì)齊。sh_addr對(duì)sh_addralign取模,結(jié)果必須為0。目前僅允許取值為0和2的冪次數(shù)。數(shù)值0和1表示節(jié)區(qū)沒(méi)有對(duì)齊約束。sh_entsize某些節(jié)區(qū)中包含固定大小的項(xiàng)目,如符號(hào)表。對(duì)于這類(lèi)節(jié)區(qū),此成員給出每個(gè)表項(xiàng)的長(zhǎng)度字節(jié)數(shù)。如果節(jié)區(qū)中并不包含固定長(zhǎng)度表項(xiàng)的表格,此成員取值為0。索引為零(SHN_UNDEF)的節(jié)區(qū)頭部也是存在的,盡管此索引標(biāo)記的是未定義的節(jié)區(qū)引用。這個(gè)節(jié)區(qū)的內(nèi)容固定如下:表7SHN_UNDEF(0)節(jié)區(qū)的內(nèi)容字段名稱(chēng)取值說(shuō)明sh_name0無(wú)名稱(chēng)sh_typeSHT_NULL非活動(dòng)sh_flags0無(wú)標(biāo)志sh_addr0無(wú)地址sh_offset0無(wú)文件偏移sh_size0無(wú)尺寸大小sh_linkSHN_UNDEF無(wú)鏈接信息sh_info0無(wú)輔助信息sh_addralign0無(wú)對(duì)齊要求sh_entsize0無(wú)表項(xiàng)節(jié)區(qū)類(lèi)型—sh_type節(jié)區(qū)類(lèi)型定義如表8:
表8節(jié)區(qū)類(lèi)型定義名稱(chēng)取值說(shuō)明SHT_NULL0此值標(biāo)志節(jié)區(qū)頭部是非活動(dòng)的,沒(méi)有對(duì)應(yīng)的節(jié)區(qū)。此節(jié)區(qū)頭部中的其他成員取值無(wú)意義。SHT_PROGBITS1此節(jié)區(qū)包含程序定義的信息,其格式和含義都由程序來(lái)解釋。SHT_SYMTAB2此節(jié)區(qū)包含一個(gè)符號(hào)表。目前目標(biāo)文件對(duì)每種類(lèi)型的節(jié)區(qū)都只能包含一個(gè),不過(guò)這個(gè)限制將來(lái)可能發(fā)生變化。一般,SHT_SYMTAB節(jié)區(qū)提供用于鏈接編輯(指ld而言)的符號(hào),盡管也可用來(lái)實(shí)現(xiàn)動(dòng)態(tài)鏈接。SHT_STRTAB3此節(jié)區(qū)包含字符串表。目標(biāo)文件可能包含多個(gè)字符串表節(jié)區(qū)。SHT_RELA4(adn32Elf32_Rela個(gè)重定位節(jié)區(qū)。SHT_HASH5此節(jié)區(qū)包含符號(hào)哈希表。所有參與動(dòng)態(tài)鏈接的目標(biāo)都必須包含一個(gè)符號(hào)哈希表。目前,一個(gè)目標(biāo)文件只能包含一個(gè)哈希表,不過(guò)此限制將來(lái)可能會(huì)解除。SHT_DYNAMIC6此節(jié)區(qū)包含動(dòng)態(tài)鏈接的信息。目前一個(gè)目標(biāo)文件中只能包含一個(gè)動(dòng)態(tài)節(jié)區(qū),將來(lái)可能會(huì)取消這一限制。SHT_NOTE7此節(jié)區(qū)包含以某種方式來(lái)標(biāo)記文件的信息。SHT_NOBITS8這種類(lèi)型的節(jié)區(qū)不占用文件中的空間,其他方面和SHT_PROGBITS相似。盡管此節(jié)區(qū)不包含任何字節(jié),成員sh_offset中還是會(huì)包含概念性的文件偏移SHT_REL9(dd2位目標(biāo)文件中的Elf32_rel類(lèi)型。目標(biāo)文件中可以擁有多個(gè)重定位節(jié)區(qū)。SHT_SHLIB10此節(jié)區(qū)被保留,不過(guò)其語(yǔ)義是未規(guī)定的。包含此類(lèi)型節(jié)區(qū)的程序與ABI不兼容。SHT_DYNSYM11作為一個(gè)完整的符號(hào)表,它可能包含很多對(duì)動(dòng)態(tài)鏈接而言不必要的符號(hào)。因此,目標(biāo)文件也可以包含一個(gè)SHT_DYNSYM節(jié)區(qū),其中保存動(dòng)態(tài)鏈接符號(hào)的一個(gè)最小集合,以節(jié)省空間。SHT_LOPROC0X70000000這一段(包括兩個(gè)邊界,是保留給處理器專(zhuān)用語(yǔ)義的。SHT_HIPROCOX7FFFFFFFSHT_LOUSER0X80000000此值給出保留給應(yīng)用程序的索引下界。SHT_HIUSER0X8FFFFFFF此值給出保留給應(yīng)用程序的索引上界。其它的節(jié)區(qū)類(lèi)型是保留的。sh_flagssh_flags字段定義了一個(gè)節(jié)區(qū)中包含的內(nèi)容是否可以修改、是否可以執(zhí)行等信息。如果一個(gè)標(biāo)志位被設(shè)置,則該位取值為1。未定義的各位都設(shè)置為0。表9節(jié)區(qū)頭部的sh_flags字段取值名稱(chēng)取值SHF_WRITE0x1SHF_ALLOC0x2SHF_EXECINSTR0x4SHF_MASKPROC0xF0000000其中已經(jīng)定義了的各位含義如下:SHF_WRITE: 節(jié)區(qū)包含進(jìn)程執(zhí)行過(guò)程中將可寫(xiě)的數(shù)據(jù)。SHF_ALLOC: 0。SHF_EXECINSTR: 節(jié)區(qū)包含可執(zhí)行的機(jī)器指令。SHF_MASKPROC: 所有包含于此掩碼中的四位都用于處理器專(zhuān)用的語(yǔ)義。2003520035月PKU/SSDB-03-TR-005?北京大學(xué)信息科學(xué)技術(shù)學(xué)院操作系統(tǒng)實(shí)驗(yàn)室第PAGE?北京大學(xué)信息科學(xué)技術(shù)學(xué)院操作系統(tǒng)實(shí)驗(yàn)室第10頁(yè)共38頁(yè)sh_linksh_info根據(jù)節(jié)區(qū)類(lèi)型的不同,sh_linksh_info的具體含義也有所不同:表10sh_link和sh_info字段解釋sh_typesh_linksh_infoSHT_DYNAMIC此節(jié)區(qū)中條目所用到的字符串表格的節(jié)區(qū)頭部索引0SHT_HASH此哈希表所適用的符號(hào)表的節(jié)區(qū)頭部索引0SHT_RELSHT_RELA相關(guān)符號(hào)表的節(jié)區(qū)頭部索引重定位所適用的節(jié)區(qū)的節(jié)區(qū)頭部索引SHT_SYMTABSHT_DYNSYM相關(guān)聯(lián)的字符串表的節(jié)區(qū)頭部索引最后一個(gè)局部符號(hào)(綁定STB_LOCAL)的符號(hào)表索引值加一其它SHN_UNDEF0特殊節(jié)區(qū)的類(lèi)型和屬性。表11常見(jiàn)特殊節(jié)區(qū)名稱(chēng)類(lèi)型屬性含義.bssSHT_NOBITSSHF_ALLOC SHF_WRITE包含將出現(xiàn)在程序的內(nèi)存映像中的為初始0件空間。.commentSHT_PROGBITS(無(wú))包含版本控制信息。.dataSHT_PROGBITSSHF_ALLOC +SHF_WRITE這些節(jié)區(qū)包含初始化了的數(shù)據(jù),將出現(xiàn)在程序的內(nèi)存映像中。.data1SHT_PROGBITSSHF_ALLOC +SHF_WRITE.debugSHT_PROGBITS(無(wú))此節(jié)區(qū)包含用于符號(hào)調(diào)試的信息。.dynamicSHT_DYNAMIC此節(jié)區(qū)包含動(dòng)態(tài)鏈接信息。節(jié)區(qū)的屬性將包SHF_ALLOCSHF_WRITE位被設(shè)置取決于處理器。.dynstrSHT_STRTABSHF_ALLOC此節(jié)區(qū)包含用于動(dòng)態(tài)鏈接的字符串,大多數(shù)情況下這些字符串代表了與符號(hào)表項(xiàng)相關(guān)的名稱(chēng)。.dynsymSHT_DYNSYMSHF_ALLOC此節(jié)區(qū)包含了動(dòng)態(tài)鏈接符號(hào)表。.finiSHT_PROGBITSSHF_ALLOC SHF_EXECINSTR此節(jié)區(qū)包含了可執(zhí)行的指令,是進(jìn)程終止代碼的一部分。程序正常退出時(shí),系統(tǒng)將安排執(zhí)行這里的代碼。.gotSHT_PROGBITS此節(jié)區(qū)包含全局偏移表。.hashSHT_HASHSHF_ALLOC此節(jié)區(qū)包含了一個(gè)符號(hào)哈希表。.initSHT_PROGBITSSHF_ALLOC SHF_EXECINSTR碼開(kāi)始調(diào)用主程序入口之前(通常指C的main函數(shù))執(zhí)行這些代碼。.interpSHT_PROGBITS么節(jié)區(qū)的屬性將包含SHF_ALLOC位,否則該位為0。.lineSHT_PROGBITS(無(wú))此節(jié)區(qū)包含符號(hào)調(diào)試的行號(hào)信息,其中描述了源程序與機(jī)器指令之間的對(duì)應(yīng)關(guān)系。其內(nèi)容是未定義的。.noteSHT_NOTE(無(wú))此節(jié)區(qū)中包含注釋信息,有獨(dú)立的格式。.pltSHT_PROGBITS此節(jié)區(qū)包含過(guò)程鏈接表(procedurelinkagetable)。.relnameSHT_REL這些節(jié)區(qū)中包含了重定位的屬性將包含SHF_ALLOC位,否則該位0name根據(jù)重定位所適用的節(jié)區(qū)給定。例如.text節(jié)區(qū)的重定位節(jié)區(qū)名字將是:.rel.text.rela.text。.relanameSHT_RELA.rodataSHT_PROGBITSSHF_ALLOC這些節(jié)區(qū)包含只讀數(shù)據(jù),這些數(shù)據(jù)通常參與進(jìn)程映像的不可寫(xiě)段。.rodata1SHT_PROGBITSSHF_ALLOC.shstrtabSHT_STRTAB此節(jié)區(qū)包含節(jié)區(qū)名稱(chēng)。.strtabSHT_STRTAB此節(jié)區(qū)包含字符串符號(hào)表相關(guān)的名稱(chēng)。如果文件擁有一個(gè)可加載的SHF_ALLOC位,否則該位為0。.symtabSHT_SYMTAB此節(jié)區(qū)包含一個(gè)符號(hào)表么節(jié)區(qū)的屬性中包含SHF_ALLOC該位置為0。.textSHT_PROGBITSSHF_ALLOC +SHF_EXECINSTR此節(jié)區(qū)包含程序的可執(zhí)行指令。在分析這些節(jié)區(qū)的時(shí)候,需要注意如下事項(xiàng):目標(biāo)文件格式允許人們定義不在上述列表中的節(jié)區(qū)。目標(biāo)文件中也可以包含多個(gè)名字相同的節(jié)區(qū)。保留給處理器體系結(jié)構(gòu)的節(jié)區(qū)名稱(chēng)一般構(gòu)成為:處理器體系結(jié)構(gòu)名稱(chēng)簡(jiǎn)寫(xiě)+名稱(chēng)。處理器名稱(chēng)應(yīng)該與e_machine中使用的名稱(chēng)相同。例如.FOO.psect街區(qū)是由FOOpsect節(jié)區(qū)。稱(chēng),如:.sdata.tdesc.sbss.lit4.lit8.reginfo.gptab.liblist.conflict…字符串表(StringELF串表中的下標(biāo)給出。(NULLNULL0的字符串在NULL的字符串。sh_size0。對(duì)空的字符串0的索引值是非法的。sh_nameELFe_shstrndx25個(gè)字節(jié)的一個(gè)字符串表,以及與不同索引相關(guān)的字符串。表12字符串表示例索引+0+1+2+3+4+5+6+7+8+90\0name.\0Var10iable\0able20\0\0xx\0表12中包含的字符串如下:索引字符串0(無(wú))1name.7Variable11able16able24(空字符串)在使用、分析字符串表時(shí),要注意以下幾點(diǎn):字符串表索引可以引用節(jié)區(qū)中任意字節(jié)。字符串可以出現(xiàn)多次可以存在對(duì)子字符串的引用同一個(gè)字符串可以被引用多次。字符串表中也可以存在未引用的字符串。符號(hào)表(Symbol0符號(hào)表項(xiàng)的格式如下:圖4符號(hào)表項(xiàng)格式定義typedefstruct{Elf32_Wordtypedefstruct{Elf32_Word st_name;Elf32_Addr Elf32_Word st_size;unsignedchar st_info;unsignedchar Elf32_Half st_shndx;}Elf32_sym;其中各個(gè)字段的含義說(shuō)明如表13:表13符號(hào)表項(xiàng)字段字段說(shuō)明st_name有名稱(chēng)。C符號(hào)在C語(yǔ)言和目標(biāo)文件的符號(hào)表中具有相同的名稱(chēng)。st_value此成員給出相關(guān)聯(lián)的符號(hào)的取值。依賴(lài)于具體的上下文,它可能是一個(gè)絕對(duì)值、一個(gè)地址等等。st_size很多符號(hào)具有相關(guān)的尺寸大小。例如一個(gè)數(shù)據(jù)對(duì)象的大小是對(duì)象中包含的字節(jié)數(shù)。如果符號(hào)沒(méi)有大小或者大小未知,則此成員為0。st_info此成員給出符號(hào)的類(lèi)型和綁定屬性。下面給出若干取值和含義的綁定關(guān)系。st_other該成員當(dāng)前包含0,其含義沒(méi)有定義。st_shndx每個(gè)符號(hào)表項(xiàng)都以和其他節(jié)區(qū)間的關(guān)系的方式給出定義。此成員給出相關(guān)的節(jié)區(qū)頭部表索引。某些索引具有特殊含義。st_info的說(shuō)明st_info中包含符號(hào)類(lèi)型和綁定信息,操縱方式如:圖5符號(hào)表項(xiàng)的st_info字段合成#define#defineELF32_ST_BIND(i)#defineELF32_ST_TYPE(i)((i)>>4)((i)&0xf)#defineELF32_ST_INFO(b,t)(((b)<<4)+((t)&0xf))的綁定類(lèi)型如:表14符號(hào)的綁定類(lèi)型名稱(chēng)取值說(shuō)明STB_LOCAL0局部符號(hào)在包含該符號(hào)定義的目標(biāo)文件以外不可見(jiàn)。相同名稱(chēng)的局部符號(hào)可以存在于多個(gè)文件中,互不影響。STB_GLOBAL1全局符號(hào)對(duì)所有將組合的目標(biāo)文件都是可見(jiàn)的。一個(gè)文件中對(duì)某個(gè)全局符號(hào)的定義將滿足另一個(gè)文件對(duì)相同全局符號(hào)的未定義引用。STB_WEAK2弱符號(hào)與全局符號(hào)類(lèi)似,不過(guò)他們的定義優(yōu)先級(jí)比較低。STB_LOPROC13處于這個(gè)范圍的取值是保留給處理器專(zhuān)用語(yǔ)義的。STB_HIPROC15全局符號(hào)與弱符號(hào)之間的區(qū)別主要有兩點(diǎn):當(dāng)鏈接編輯器組合若干可重定位的目標(biāo)文件時(shí),不允許對(duì)同名的STB_GLOBAL另一方面如果一個(gè)已定義的全局符號(hào)已經(jīng)存在,出現(xiàn)一個(gè)同名的弱符號(hào)并不會(huì)產(chǎn)生錯(cuò)誤。鏈接編輯器盡關(guān)心全局符號(hào),忽略弱符號(hào)。類(lèi)似地,如果一個(gè)公共符號(hào)(符號(hào)的st_shndx中包含SHN_COMMON,那么具有相同名稱(chēng)的弱符號(hào)出現(xiàn)也不會(huì)導(dǎo)致錯(cuò)誤。鏈接編輯器會(huì)采納公共定義,而忽略弱定義。當(dāng)鏈接編輯器搜索歸檔庫(kù)(archivelibraries)義全局符號(hào)的檔案成員。成員的定義可以是全局符號(hào),也可以是弱符號(hào)。連接編輯器不會(huì)提取檔案成員來(lái)滿足未定義的弱符號(hào)。未能解析的弱符號(hào)取值為0。在每個(gè)符號(hào)表中,所有具有STB_LOCAL綁定的符號(hào)都優(yōu)先于弱符號(hào)和全局符sh_info頭部成員包含第一個(gè)非局部符號(hào)的符號(hào)表索引。符號(hào)類(lèi)型符號(hào)類(lèi)型(ELF32_ST_TYPE)定義如下:表15符號(hào)類(lèi)型名稱(chēng)取值說(shuō)明STT_NOTYPE0符號(hào)的類(lèi)型沒(méi)有指定STT_OBJECT1符號(hào)與某個(gè)數(shù)據(jù)對(duì)象相關(guān),比如一個(gè)變量、數(shù)組等等STT_FUNC2符號(hào)與某個(gè)函數(shù)或者其他可執(zhí)行代碼相關(guān)STT_SECTION3符號(hào)與某個(gè)節(jié)區(qū)相關(guān)。這種類(lèi)型的符號(hào)表項(xiàng)主要用于重定位,通常具有STB_LOCAL綁定。STT_FILE4稱(chēng)。文件符號(hào)具有STB_LOCAL綁定,其節(jié)區(qū)索引是L符號(hào)(如果有的話)STT_LOPROC13此范圍的符號(hào)類(lèi)型值保留給處理器專(zhuān)用語(yǔ)義用途。STT_HIPROC15在共享目標(biāo)文件中的函數(shù)符號(hào)(類(lèi)型為STT_FUNC)具有特別的重要性。當(dāng)其他程鏈接表項(xiàng)。類(lèi)型不是STT_FUNC的共享目標(biāo)符號(hào)不會(huì)自動(dòng)通過(guò)過(guò)程鏈接表進(jìn)行引用。如果一個(gè)符號(hào)的取值引用了某個(gè)節(jié)區(qū)中的特定位置,那么它的節(jié)區(qū)索引成員(st_shndx)包含了其在節(jié)區(qū)頭部表中的索引。當(dāng)節(jié)區(qū)在重定位過(guò)程中被移動(dòng)時(shí),符號(hào)的取值也會(huì)隨之變化,對(duì)符號(hào)的引用始終會(huì)“指向”程序中的相同位置。特殊的節(jié)區(qū)索引某些特殊的節(jié)區(qū)索引具有不同的語(yǔ)義:SHN_ABS:符號(hào)具有絕對(duì)取值,不會(huì)因?yàn)橹囟ㄎ欢l(fā)生變化。SHN_COMMON:符號(hào)標(biāo)注了一個(gè)尚未分配的公共sh_addralignst_valueSHN_UNDEF: 當(dāng)鏈接編輯器將此目標(biāo)文件與其他定義了該符號(hào)的目標(biāo)STN_UNDEF符號(hào)表16STN_UNDEF符號(hào)名稱(chēng)取值說(shuō)明st_name0無(wú)名稱(chēng)st_value00值st_size0無(wú)大小st_info0無(wú)類(lèi)型,局部綁定st_other0無(wú)附加信息st_shndx0無(wú)節(jié)區(qū)符號(hào)取值不同的目標(biāo)文件類(lèi)型中符號(hào)表項(xiàng)對(duì)st_value成員具有不同的解釋?zhuān)涸诳芍囟ㄎ晃募?,st_value中遵從了節(jié)區(qū)索引為SHN_COMMON的符號(hào)的對(duì)齊約束。st_value是從st_shndx所標(biāo)識(shí)的節(jié)區(qū)頭部開(kāi)始計(jì)算,到符號(hào)位置的偏移。在可執(zhí)行和共享目標(biāo)文件中,st_value包含一個(gè)虛地址。為了使得這些文件的符號(hào)對(duì)動(dòng)態(tài)鏈接器更有用,節(jié)區(qū)偏移(針對(duì)文件的解釋?zhuān)┨摂M地址(針對(duì)內(nèi)存的解釋?zhuān)驗(yàn)檫@時(shí)與節(jié)區(qū)號(hào)無(wú)關(guān)。數(shù)據(jù)訪問(wèn)方式。重定位信息相關(guān)的調(diào)用指令必須把控制傳輸?shù)竭m當(dāng)?shù)哪繕?biāo)執(zhí)行地址。重定位表項(xiàng)標(biāo)文件保存進(jìn)程的程序映像的正確信息。重定位表項(xiàng)就是這樣一些數(shù)據(jù)。重定位表項(xiàng)的格式如圖6:圖6重定位表項(xiàng)的格式typedefstruct{Elf32_Addrr_offset;Elf32_Wordr_info;typedefstruct{Elf32_Addrr_offset;Elf32_Wordr_info;}Elf32_Rel;typedefstruct{Elf32_Addrr_offset;Elf32_Wordr_info;Elf32_Wordr_addend;}Elf32_Rela;其中,各個(gè)字段的說(shuō)明如下表:表17重定位表項(xiàng)字段說(shuō)明成員說(shuō)明r_offset此值是從節(jié)區(qū)頭部開(kāi)始到將被重定位影響的存儲(chǔ)單位之間的字節(jié)偏移。對(duì)于可執(zhí)行文件或者共享目標(biāo)文件而言,其取值是被重定位影響到的存儲(chǔ)單元的虛擬地址。r_info此成員給出要進(jìn)行重定位的符號(hào)表索引,以及將實(shí)施的重定位類(lèi)型。索引是STN_UNDEF,那么重定位使用0作為“符號(hào)值”。重定位類(lèi)r_infoELF32_R_TYPEELF32_R_SYM的結(jié)果。#defineELF32_R_SYM(i)((i)>>8)#defineELF32_R_TYPE(i)((unsignedchar)(i))#defineELF32_R_INFO(s,t)(((s)<<8)+(unsignedchar)(t))r_addendElf32_RelaElf32_Rel的表項(xiàng)在將被修改的位置保存隱式的補(bǔ)齊信息。依賴(lài)于處理器體系結(jié)構(gòu),各種形式都可能sh_infosh_linkr_offset同的解釋。在可重定位文件中,r_offset中包含節(jié)區(qū)偏移。就是說(shuō)重定位節(jié)區(qū)自身一個(gè)存儲(chǔ)單元。在可執(zhí)行文件和共享的目標(biāo)文件中,r_offset中包含一個(gè)虛擬地址。為(件的解釋?zhuān)┳屛挥谔摰刂罚ㄡ槍?duì)內(nèi)存的解釋。r_offset的解釋會(huì)有少許不同,重定位類(lèi)型的含義始終不變。重定位類(lèi)型重定位表項(xiàng)描述如何修改后面的指令和數(shù)據(jù)字段。一般,共享目標(biāo)文件在創(chuàng)建時(shí),其基本虛擬地址是0,不過(guò)執(zhí)行地址將隨著動(dòng)態(tài)加載而發(fā)生變化。重定位的過(guò)程,按照如下標(biāo)記:A用來(lái)計(jì)算可重定位字段的取值的補(bǔ)齊。B共享目標(biāo)在執(zhí)行過(guò)程中被加載到內(nèi)存中的位置(基地址。G表的索引。GOT全局偏移表(GOT)的地址。L某個(gè)符號(hào)的過(guò)程鏈接表項(xiàng)的位置(節(jié)區(qū)偏移/地址。過(guò)程鏈接表項(xiàng)接表,動(dòng)態(tài)鏈接器在執(zhí)行過(guò)程中修改這些項(xiàng)目。P(r_offset計(jì)算(址。S其索引位于重定位項(xiàng)中的符號(hào)的取值。重定位項(xiàng)的r_offset取值給定受影響的存儲(chǔ)單位的第一個(gè)字節(jié)的偏移或者虛擬地址。重定位類(lèi)型給出那些位需要修改以及如何計(jì)算它們的取值。SYSTEMVElf32_RelX86體系結(jié)構(gòu)下常見(jiàn)的重定位類(lèi)型:表18x86體系結(jié)構(gòu)下常見(jiàn)的重定位類(lèi)型名稱(chēng)數(shù)值字段計(jì)算說(shuō)明R_386_NONE0(無(wú))(無(wú))R_386_321word32S+AR_386_PC322word32S+A-PR_386_GOT323word32G+A-P此重定位類(lèi)型計(jì)算從全局偏移表基址到符號(hào)的全局偏移表項(xiàng)之間的距離。它會(huì)通知連接編輯器構(gòu)造一個(gè)全局偏移表。R_386_PLT324word32L+A-P此重定位類(lèi)型計(jì)算符號(hào)的過(guò)程鏈接表項(xiàng)的地質(zhì),并通知鏈接編輯器構(gòu)造一個(gè)過(guò)程鏈接表。R_386_COPY5(無(wú))(無(wú))鏈接編輯器創(chuàng)建這種重定位類(lèi)型的目的是支于當(dāng)前目標(biāo)文件中,也存在于某個(gè)共享目標(biāo)的符號(hào)相關(guān)的數(shù)據(jù)復(fù)制到由偏移給出的位置。R_386_GLOB_DAT6word32S此重定位類(lèi)型用來(lái)把某個(gè)全局偏移表項(xiàng)設(shè)置為給定符號(hào)的地址。這種特殊的重定位類(lèi)型允許確定符號(hào)與全局偏移表項(xiàng)之間的關(guān)系。R_386_JMP_SLOT7word32S鏈接編輯器創(chuàng)建這種重定位類(lèi)型主要是為了內(nèi)容,把控制傳輸給指定符號(hào)的地址。R_386_RELATIVE8word32B+A鏈接編輯器創(chuàng)建這種重定位類(lèi)型是為了支持的虛地址和相對(duì)地址相加,計(jì)算對(duì)應(yīng)的虛地為0。R_386_GOTOFF9word32S+A-GOT這種重定位類(lèi)型會(huì)計(jì)算符號(hào)取值與全局偏移表地址間的差。并通知鏈接編輯器創(chuàng)建一個(gè)全局偏移表。R_386_GOTPC10word32GOT+A-P此重定位類(lèi)型與R_386_PC32類(lèi)似,只不過(guò)位項(xiàng)中引用的符號(hào)通常是暗示連接編輯器構(gòu)造全局偏移表。程序加載和動(dòng)態(tài)鏈接實(shí)現(xiàn)程序加載和動(dòng)態(tài)鏈接的主要技術(shù)有:(mr用來(lái)在文件中定位各個(gè)段的映像。同時(shí)包含其他一些用來(lái)為程序創(chuàng)建進(jìn)程映像所必需的信息。程序加載:給定一個(gè)目標(biāo)文件,系統(tǒng)加載該文件到內(nèi)存中,啟動(dòng)程序執(zhí)行。號(hào)引用,以便完整地構(gòu)造進(jìn)程映像。程序頭部(ProgramHeader)也就是“段內(nèi)容(Segments。程序頭部?jī)H對(duì)于可執(zhí)行文件和共享目標(biāo)文件有意義。typedefstruct{Elf32_Wordp_type;Elf32_Off Elf32_Addrp_vaddr;Elf32_Addrp_paddr;Elf32_Wordp_filesz;Elf32_Wordp_memsz;Elf32_Wordp_flags;Elf32_Wordp_align;}Elf32_phdr;typedefstruct{Elf32_Wordp_type;Elf32_Off Elf32_Addrp_vaddr;Elf32_Addrp_paddr;Elf32_Wordp_filesz;Elf32_Wordp_memsz;Elf32_Wordp_flags;Elf32_Wordp_align;}Elf32_phdr;圖7程序頭部數(shù)據(jù)結(jié)構(gòu)其中各個(gè)字段說(shuō)明如下:p_type 19。p_offset 此成員給出從文件頭到該段第一個(gè)字節(jié)的偏移。p_vaddr 此成員給出段的第一個(gè)字節(jié)將被放到內(nèi)存中的虛擬地址。p_paddrSystemV文件而言具體內(nèi)容是未指定的。p_filesz 0。p_memsz 0。p_flags 此成員給出與段相關(guān)的標(biāo)志。p_align 可加載的進(jìn)程段的p_vaddr和p_offset取值必須合適,相對(duì)段類(lèi)型
對(duì)齊。數(shù)值0和1表示不需要對(duì)齊。否則p_align應(yīng)該是個(gè)2p_offsetp_align取模后應(yīng)該相等??蓤?zhí)行ELF目標(biāo)文件中的段類(lèi)型如表19所示:表19段類(lèi)型名字取值說(shuō)明PT_NULL0此數(shù)組元素未用。結(jié)構(gòu)中其他成員都是未定義的。PT_LOAD1此數(shù)組元素給出一個(gè)可加載的段,段的大小由p_filesz和p_memsz描述。文件中的字節(jié)被映射到內(nèi)存段開(kāi)始處。如果p_memsz大于p_filesz,“剩余”的字節(jié)要清零。p_filesz不能大于p_memsz??杉虞dp_vaddr成員按升序排列。PT_DYNAMIC2數(shù)組元素給出動(dòng)態(tài)鏈接信息。PT_INTERP3NULL當(dāng)作解釋器調(diào)用。這種段類(lèi)型僅對(duì)與可執(zhí)行文件有意義(盡管也可能在共享目標(biāo)文件上發(fā)生這種類(lèi)型的段,它必須在所有可加載段項(xiàng)目的前面。PT_NOTE4此數(shù)組元素給出附加信息的位置和大小。PT_SHLIB5此段類(lèi)型被保留,不過(guò)語(yǔ)義未指定。包含這種類(lèi)型的段的程序與ABI不符。PT_PHDR6既包括在文件中也包括在內(nèi)存中的信息。此類(lèi)型的段在文件中不能出現(xiàn)一次以上。并且只有程序頭部表是程序的內(nèi)存映像的一部分時(shí)才起作用。如果存在此類(lèi)型段,則必須在所有可加載段項(xiàng)目的前面。PT_LOPROC0x70000000此范圍的類(lèi)型保留給處理器專(zhuān)用語(yǔ)義。PT_HIPROC0x7fffffff基地址(BaseAddress)是在執(zhí)行過(guò)程中從三個(gè)數(shù)值計(jì)算的:內(nèi)存加載地址最大頁(yè)面大小程序的可加載段的最低虛地址。PT_LOADp_vaddrp_vaddr相同也可能不同?!?bssSHT_NOBITSp_memszp_filesz注釋節(jié)區(qū)(NoteSection)SHT_NOTEPT_NOTE4例如:nameszdescsztypename...desc...圖8注釋節(jié)區(qū)示例其中:nameszname注釋信息的name部分前namesz字節(jié)包含一個(gè)NULL中04namesz中。descszdescdescdescsz字節(jié)包含注釋信息的描述。ABI對(duì)此沒(méi)有作出約束。如果需要,可以用補(bǔ)零來(lái)確保4字節(jié)descsz中。type word取值必須非負(fù)。ABI并不定義描述符的含義[3]。程序加載須具有這樣的段:其文件偏移和虛擬地址對(duì)頁(yè)面大小取模后余數(shù)相同。例如,可執(zhí)行文件布局如圖9:文件偏移 文件 虛擬地址ELF頭部其他信息正文段ELF頭部其他信息正文段……0x2BE00字節(jié)數(shù)據(jù)段……0x4E00其他信息程序頭部表
Ox80481000x8073eff0x8074f000x8079cff圖9可執(zhí)行文件布局示例該可執(zhí)行文件中程序頭部段如所示:表20可執(zhí)行文件程序頭部段示例成員正文段數(shù)據(jù)段p_typePT_LOADPT_LOADp_offset0X1000x2bf00p_vaddr0x80481000x8074f00p_paddr未指定未指定p_filesz0x2BE000x4e00p_memsz0x2BE000x5e24p_flagsPF_R+PF_XPF_R+PF_W+PF_Xp_align0x10000x1000在這個(gè)例子中,至多四個(gè)文件頁(yè)面包含非純粹的正文或者數(shù)據(jù)。(1).第一個(gè)頁(yè)面中包含ELF頭部、程序頭部表、以及其它信息(2).最后一個(gè)頁(yè)面包含數(shù)據(jù)開(kāi)始部分的一個(gè)副本第一數(shù)據(jù)頁(yè)面包含正文段的末尾部分最后一個(gè)數(shù)據(jù)頁(yè)面可能包含與運(yùn)行進(jìn)程無(wú)關(guān)的文件信息不過(guò)系統(tǒng)對(duì)這些頁(yè)面一般會(huì)做兩次映射,以保證每個(gè)段的內(nèi)存訪問(wèn)許可是相同的。數(shù)據(jù)段的末尾需要對(duì)未初始化數(shù)據(jù)進(jìn)行特殊處理,系統(tǒng)應(yīng)該將這些初始化為0。p_vaddr另外,共享目標(biāo)文件的段通常包含與位置無(wú)關(guān)的代碼。這使得段的虛擬地址在不同的進(jìn)程中不同,但不影響執(zhí)行行為。盡管系統(tǒng)為每個(gè)進(jìn)程選擇獨(dú)立的虛擬地址,仍能維持段的相對(duì)位置。因?yàn)槲恢锚?dú)立的代碼在段與段之間使用相對(duì)尋址,內(nèi)存虛地址之間的差異必須與文件中虛擬地址之間的差異相匹配。位問(wèn)題。表21虛擬地址指定方案示例源正文數(shù)據(jù)基地址文件0x2000x2a4000x0進(jìn)程10x800002000x8002a4000x80000000進(jìn)程20x800812000x800ab4000x80081000進(jìn)程30x900c02000x900ea4000x900c0000進(jìn)程40x900c62000x900f04000x900c6000動(dòng)態(tài)鏈接程序解釋器可執(zhí)行文件可以包含PT_INTERP程序頭部元素。在exec()期間,系統(tǒng)從PT_INTERP段中檢索路徑名,并從解釋器文件的段創(chuàng)建初始的進(jìn)程映像。也就是說(shuō),解釋器可以有兩種方式接受控制。接受一個(gè)文件描述符,讀取可執(zhí)行文件并將其映射到內(nèi)存中供一個(gè)已經(jīng)打開(kāi)的文件描述符。解釋器可以是一個(gè)可執(zhí)行文件,也可以是一個(gè)共享目標(biāo)文件。在mmap以及相關(guān)服務(wù)所使用的動(dòng)態(tài)段區(qū)域創(chuàng)建共享目標(biāo)文件的段。因此,共享目標(biāo)解釋器通常不會(huì)與原來(lái)的可執(zhí)行文件的原始段地址發(fā)生沖突。生沖突。解釋器要負(fù)責(zé)解決這種沖突。動(dòng)態(tài)加載程序PT_INTERP統(tǒng)所提供的動(dòng)態(tài)鏈接器的位置是和處理器相關(guān)的。Exec()(1).把共享目標(biāo)內(nèi)存段添加到進(jìn)程映像中;為可執(zhí)行文件和它的共享目標(biāo)執(zhí)行重定位操作;關(guān)閉用來(lái)讀入可執(zhí)行文件的文件描述符,如果動(dòng)態(tài)鏈接程序收到過(guò)這樣的文件描述符的話;exec直接得到控制。鏈接編輯器也會(huì)構(gòu)造很多數(shù)據(jù)來(lái)協(xié)助動(dòng)態(tài)鏈接器處理可執(zhí)行文件和共享目標(biāo)文件。這些數(shù)據(jù)包含在可加載段中,在執(zhí)行過(guò)程中可用。如:類(lèi)型為SHT_DYNAMIC的.dynamic節(jié)區(qū)包含很多數(shù)據(jù)。位于節(jié)區(qū)頭部的結(jié)構(gòu)保存了其他動(dòng)態(tài)鏈接信息的地址。SHT_HASH的.hash節(jié)區(qū)包含符號(hào)哈希表。SHT_PROGBITS.got.plt程鏈接表。因?yàn)槿魏畏螦BI規(guī)范的程序都要從共享目標(biāo)庫(kù)中導(dǎo)入基本的系統(tǒng)服務(wù),動(dòng)態(tài)鏈接器會(huì)參與每個(gè)符合ABI規(guī)范的程序的執(zhí)行。動(dòng)態(tài)節(jié)區(qū)PT_DYNAMIC.dynamic_DYNAMIC含如下結(jié)構(gòu)的數(shù)組。圖10動(dòng)態(tài)節(jié)區(qū)符號(hào)結(jié)構(gòu)typedefstruct{Elf32_Swordd_tag;union{typedefstruct{Elf32_Swordd_tag;union{Elf32_Word Elf32_Addr }d_un;}Elf32_Dyn;externElf32_Dyn _DYNAMIC[];對(duì)每個(gè)這種類(lèi)型的對(duì)象,d_tag控制d_un的解釋含義:d_valElf32_Word對(duì)象表示一個(gè)整數(shù)值,可以有多種解釋。d_ptr此Elf32_Addr對(duì)象代表程序的虛擬地址。如前所述,文件的虛擬地址可能與執(zhí)行過(guò)程中的內(nèi)存虛地址不匹配。在解釋包含于動(dòng)態(tài)結(jié)構(gòu)中的地址時(shí),動(dòng)態(tài)鏈接程序基于原來(lái)文件值和內(nèi)存基地址計(jì)算實(shí)際地址。為了保持一致性,文件中不包含用來(lái)“糾正”動(dòng)態(tài)結(jié)構(gòu)中重定位項(xiàng)地址的重定位項(xiàng)目。下面的表格總結(jié)了可執(zhí)行文件和共享目標(biāo)文件對(duì)標(biāo)志的要求。如果標(biāo)志被標(biāo)記為I規(guī)范的文件的動(dòng)態(tài)鏈接數(shù)組必須包含一個(gè)該類(lèi)型表項(xiàng)意味著該標(biāo)志可以出現(xiàn),但不是必需的。表22動(dòng)態(tài)項(xiàng)標(biāo)志說(shuō)明名稱(chēng)數(shù)值d_un可執(zhí)行共享目標(biāo)說(shuō)明DT_NULL0忽略必需必需標(biāo)記為DT_NULL的項(xiàng)目標(biāo)注了整個(gè)_DYNAMIC數(shù)組的末端。DT_NEEDED1d_val可選可選此元素包含一個(gè)NULL結(jié)尾的字符串的字符串表DT_STRTAB有很大關(guān)系。DT_PLTRELSZ2d_val可選可選此元素給出了與過(guò)程鏈接表(PLT)位項(xiàng)的總計(jì)大?。ò醋止?jié)DT_JMPRELDT_PLTRELSZ目。DT_PLTGOT3d_ptr可選可選與/或全局偏移表相關(guān)聯(lián)的一個(gè)地址。DT_HASH4d_ptr必需必需DT_SYMTAB元素引用的符號(hào)表。DT_STRTAB5d_ptr必需必需他字符串都包含在此表中。DT_SYMTAB6d_ptr必需必需32這個(gè)符號(hào)表中的條目是Elf32_Sym類(lèi)型。DT_RELA7d_ptr必需可選32Elf32_Rela。目存在,動(dòng)態(tài)結(jié)構(gòu)必須也包含DT_RELASZ和DT_RELAENTDT_RELADT_REL都可能存在(二者都是允許存在但不要求存在的。DT_RELASZ8d_val必需可選此元素包含DT_RELA重定位表的大小(按字節(jié)數(shù)計(jì)算。DT_RELAENT9d_val必需可選此元素包含DT_RELA重定位項(xiàng)的大小(按字節(jié)計(jì)算。DT_STRSZ10d_val必需必需此元素給出字符串表的大小,按字節(jié)數(shù)計(jì)算。DT_SYMENT11d_val必需必需此元素給出符號(hào)表項(xiàng)的大小,按字節(jié)數(shù)計(jì)算。DT_INIT12d_ptr可選可選此元素包含初始化函數(shù)的地址。DT_FINI13d_ptr可選可選(Termination的地址。DT_SONAME14d_val忽略可選此元素給出一個(gè)NULL結(jié)尾的字符串的字符串表DT_STRTABDT_RPATH15d_val可選忽略NULLDT_STRTAB項(xiàng)目所記錄的表格的索引。DT_SYMBOLIC16忽略忽略可選行文件和其他共享目標(biāo)。DT_REL17d_ptr必需可選DT_RELA32Elf32_RelDT_RELSZ和DT_RELENT元素。DT_RELSZ18d_val必需可選DT_REL數(shù)計(jì)算。DT_RELENT19d_val必需可選DT_REL算。DT_PLTREL20d_val可選可選此成員給出過(guò)程鏈接表所引用的重定位項(xiàng)的類(lèi)型。根據(jù)具體情況,d_val成員包含DT_REL或者DT_RELA。過(guò)程鏈接表中的所有重定位都必須采用相同的重定位方式。DT_DEBUG21d_ptr可選忽略ABI目的程序與ABI不兼容。DT_TEXTREL22忽略可選可選此可以作相應(yīng)的準(zhǔn)備。DT_JMPREL23d_ptr可選可選d_ptr行。如果存在此成員,相關(guān)的DT_PLTRELSZ和DT_PLTREL必須也存在。DT_LOPROC0x70000000未指定未指定未指定這個(gè)范圍的表項(xiàng),包括DT_LOPROC和DT_HIPROC都是保留給處理器特定的語(yǔ)義的。DT_HIPROC0x7fffffff未指定未指定未指定注:沒(méi)有出現(xiàn)在此表中的標(biāo)記值是保留的。除了數(shù)組末尾的DT_NULL元素以及DT_NEEDED元素的相對(duì)順序約束以外,其他項(xiàng)目可以以任意順序出現(xiàn)。共享目標(biāo)的依賴(lài)關(guān)系描述了它們的特定的依賴(lài)關(guān)系。在動(dòng)態(tài)鏈接器為某個(gè)目標(biāo)文件創(chuàng)建內(nèi)存段時(shí),依賴(lài)關(guān)系(記錄于動(dòng)態(tài)結(jié)構(gòu)的DT_NEEDED表項(xiàng)中)能夠提供需要哪些目標(biāo)來(lái)提供程序服務(wù)的信息。通過(guò)不斷地將DT_NEEDED(按順序)DT_NEEDED即使某個(gè)共享目標(biāo)在依賴(lài)表中出現(xiàn)多次,動(dòng)態(tài)鏈接器也僅會(huì)對(duì)其連接一次。DT_SONAMElib1的DT_SONAME項(xiàng),并且使用了路徑名為/usr/llib/lib2的共lib1/usr/lib/lib2。(/串作為路徑名稱(chēng)。如果名稱(chēng)中沒(méi)有斜線,則對(duì)共享目標(biāo)的路徑搜索按如下順序進(jìn)行::”分隔,用來(lái)通知?jiǎng)討B(tài)鏈接器從哪里開(kāi)始搜索。默認(rèn)情況下最后搜索當(dāng)前目錄。的變量,其中也包含若干都在之后被搜索。盡管某些程序?qū)Ψ痔?hào)前后的列表的處理有所不同,動(dòng)態(tài)鏈接程序并不這樣,它能夠接受分號(hào),語(yǔ)義如上。/usr/lib搜索。注意:注意:SUIDSGID的程序忽略環(huán)境搜索規(guī)范(如_。不過(guò)仍然會(huì)搜索和/usr/lib路徑。全局偏移表(GOT)對(duì)位置。以后,動(dòng)態(tài)鏈接器要處理重定位項(xiàng),其中有一些重定位項(xiàng)的類(lèi)型是R_386_GLOB_DAT,地址。重定位,因而確保了執(zhí)行過(guò)程中絕對(duì)地址信息可用。0_DYNAMIC32Intel12也是保留的。變其地址。只有進(jìn)程存在,其內(nèi)存段都位于固定的虛地址。externElf32_Addr_GLOBAL_OFFSET_TABLE[];32Intel體系結(jié)構(gòu)而言,_GLOBAL_OFFSET_TABLE_可以用來(lái)訪問(wèn)該表。externElf32_Addr_GLOBAL_OFFSET_TABLE[];_GLOBAL_OFFSET_TABLE_.got節(jié)區(qū)的中間,允許使用負(fù)的/非負(fù)的下標(biāo)來(lái)訪問(wèn)地址數(shù)組。過(guò)程鏈接表全局偏移表(GO)用來(lái)將位置獨(dú)立的地址計(jì)算重定向到絕對(duì)位置,與此相似,析從一個(gè)可執(zhí)行文件/共享目標(biāo)到另一個(gè)可執(zhí)行文件/共享目標(biāo)控制轉(zhuǎn)移(例如函數(shù)調(diào)用SystemV.PLT0:pushlgot_plus_4jmp.PLT0:pushlgot_plus_4jmp *got_plus_8nop; nopnop; nop.PLT1:jmp *name1_in_GOTpushl$offset@PC.PLT2:jmp *name2_in_GOTpushl$offsetjmp .PLT0@PC...圖11絕對(duì)過(guò)程鏈接表.PLT0:pushl4(%ebx).PLT0:pushl4(%ebx)jmp *8(%ebx)nop; nopnop; nop.PLT1:jmp *name1@GOT(%ebx)pushl$offsetjmp .PLT0@PC.PLT2:jmp *name2@GOT(%ebx)pushl$offsetjmp .PLT0@PC...圖12位置獨(dú)立的過(guò)程鏈接表((用不同的操作數(shù)尋址模式。盡管如此,它們對(duì)動(dòng)態(tài)鏈接器的接口還是相同的。特殊值。%bx表的基址寄存器。name1,name1.PLT1。name1pushl指令的地址,而不是name1的真實(shí)地址。接下來(lái),程序?qū)⒅囟ㄎ黄疲╫ffset)32R_386_JMP_SLOT,jmpGOTname1。.PLT0,也就是過(guò)程鏈接表的第一項(xiàng)。pushl(got_plus_44(%ebx))GOT存的地址(got_plus_8或者8(%ebx),后者將控制傳遞給動(dòng)態(tài)鏈接器。name1name1,不會(huì)再次調(diào)用動(dòng)態(tài)鏈接.PLT1處的jmp將控制傳遞給name1pushl令。LD_BIND_NOWR_386_JMP_SLOT行懶惰計(jì)算,延遲符號(hào)解析和重定位,直到某個(gè)表項(xiàng)的第一次執(zhí)行。哈希表(Hash由Elf32_Word對(duì)象組成的哈希表支持符號(hào)表訪問(wèn)。下面的例子有助于解釋哈希表組織,不過(guò)不是規(guī)范的一部分。圖13符號(hào)哈希表的組織nbucketnchainbucket[0]...bucket[nbucket-1]chain[0]...chain[nchain-a]bucket數(shù)組包含nbucket個(gè)項(xiàng)目,chain數(shù)組包含nchain個(gè)項(xiàng)目,下標(biāo)都是從0bucketchainChainnchainchain表項(xiàng)。哈希bucket的索引。因此,如果哈希函數(shù)針對(duì)某個(gè)名字返回了數(shù)值X,則bucket[X%nbucket]給出了chainchain[y]chain鏈一直搜索,直到所選中的符號(hào)表項(xiàng)包含了所需要的符號(hào),或者chain項(xiàng)中包含值STN_UNDEF。哈希函數(shù)F實(shí)現(xiàn)中常用的哈希函數(shù)如下,有時(shí)候會(huì)作一些優(yōu)化(比如Linu。unsignedlongunsignedlongelf_hash
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 養(yǎng)老院入住老人衣物洗滌與保養(yǎng)制度
- 企業(yè)食堂安全管理制度
- 會(huì)議代表權(quán)益保障制度
- 2026年中考化學(xué)實(shí)驗(yàn)操作技能測(cè)試題
- 2026年旅游景點(diǎn)營(yíng)銷(xiāo)與策劃實(shí)務(wù)試題
- 2026年機(jī)械工程基礎(chǔ)理論與應(yīng)用題集
- 2026年物業(yè)垃圾清運(yùn)外包協(xié)議(環(huán)?!ず弦?guī)版)
- 檢驗(yàn)科化學(xué)試劑爆炸的應(yīng)急處置制度及流程
- 古代日本高分突破課件
- 2024年甘孜縣招教考試備考題庫(kù)附答案解析(必刷)
- 對(duì)外話語(yǔ)體系構(gòu)建的敘事話語(yǔ)建構(gòu)課題申報(bào)書(shū)
- 馬年猜猜樂(lè)(馬的成語(yǔ))打印版
- 精神障礙防治責(zé)任承諾書(shū)(3篇)
- 2025年擔(dān)保公司考試題庫(kù)(含答案)
- 2025年金融控股公司行業(yè)分析報(bào)告及未來(lái)發(fā)展趨勢(shì)預(yù)測(cè)
- 物業(yè)節(jié)前安全教育培訓(xùn)
- 介入病人安全管理
- 人教版PEP五年級(jí)英語(yǔ)下冊(cè)單詞表與單詞字帖 手寫(xiě)體可打印
- 戶口未婚改已婚委托書(shū)
- 國(guó)內(nèi)外影視基地調(diào)研報(bào)告-副本
- 家具制造廠家授權(quán)委托書(shū)
評(píng)論
0/150
提交評(píng)論