ELF 文件格式分析_第1頁
ELF 文件格式分析_第2頁
ELF 文件格式分析_第3頁
ELF 文件格式分析_第4頁
ELF 文件格式分析_第5頁
已閱讀5頁,還剩33頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

PKU/SSDB-03-TN-005JBEOS-TN-03-00520035月ELF文件格式分析類操作系統(tǒng)中普遍采用的目標文件格式ELF(ExecutableandLinkableForat,目的是研究操作系統(tǒng)中二進制級軟件構(gòu)件的靜態(tài)、動態(tài)組裝技術(shù)。ELFC語言程序,分析編譯、鏈接后生成的可重定位、可執(zhí)行格式實例。關(guān)鍵詞 操作系統(tǒng)編譯鏈接目標文件軟件構(gòu)件目 錄簡介 1相關(guān)標準 1SYSTEMVABI 1LSB 2ELF文件格式 2簡介 2目標文件中的數(shù)據(jù)表示 2目標文件格式 3ELFHEADER部分 3節(jié)區(qū)(SECTIONS) 6節(jié)區(qū)頭部表格 6節(jié)區(qū)頭部 7特殊節(jié)區(qū) 10字符串表(STRING12符號表(SYMBOL13關(guān)于st_info的說明 13符號類型 14特殊的節(jié)區(qū)索引 15STN_UNDEF符號 15符號取值 15重定位信息 16重定位表項 16重定位類型 17程序加載和動態(tài)鏈接 19程序頭部(ProgramHeader) 19程序加載 21動態(tài)鏈接 23全局偏移表(GOT) 27過程鏈接表28哈希表(Hash30初始化和終止函數(shù) 313.9 C庫 31關(guān)于C庫函數(shù) 31全局數(shù)據(jù)符號 33圖形目錄圖1目標文件格式 3圖2 ELFHeader數(shù)據(jù)結(jié)構(gòu) 3圖3節(jié)區(qū)頭部數(shù)據(jù)結(jié)構(gòu) 7圖4符號表項格式定義 13圖5符號表項的st_info字段合成 13圖6重定位表項的格式 16圖7程序頭部數(shù)據(jù)結(jié)構(gòu) 19圖8注釋節(jié)區(qū)示例 21圖9可執(zhí)行文件布局示例 22圖10動態(tài)節(jié)區(qū)符號結(jié)構(gòu) 24圖絕對過程鏈接表 28圖12位置獨立的過程鏈接表 29圖13符號哈希表的組織 302003520035月PKU/SSDB-03-TR-005?北京大學信息科學技術(shù)學院操作系統(tǒng)實驗室第PAGE?北京大學信息科學技術(shù)學院操作系統(tǒng)實驗室第1頁共38頁簡介(ExecutableandLinkingFormaX(UNIXSystem(ApplicationBinaryInterface,ABI)的一部分。工具接口標準InterfaceStandards,TIS)委員會將還ELF32Intel體系結(jié)構(gòu)上的很多操作系統(tǒng)中使用[1,2]。ELF式、可執(zhí)行文件格式以及調(diào)試記錄信息與格式等。TISPortableFormatsSpecification1.1版本中主要針對三種不同類型的目標ANSIClibc例程必須提供的符號[1]。在該組織隨后發(fā)布的ExecutableandLinkingFormat(ELF)Specification1.2行了重新組織:BookI:ExecutableandLinkingFormatELF目標文件格式;BookII:ProcessorSpecific(IntelArchitecture)ELF中與硬件相關(guān)的信息;BookIII:OperatingSystemSpecificELF中與操作系統(tǒng)相關(guān)的部分,例如SystemVRelease4信息等。相關(guān)標準SystemVABISystemVApplicationBinaryInterface(ABI)接口,使得這些程序能夠運行在符合X/OpenCommenApplicationEnvironmentSpecification,Issue4.2SystemVInterfaceDefinition,FourthEdition的操作系統(tǒng)上。二ABI并不是只有一個規(guī)范,而是一個規(guī)范體系。SystemVABISystemV在所有硬件平臺上都一致的接口[3];一個處理器相關(guān)的部分,描述特定于某個處理器體系結(jié)構(gòu)的具體實現(xiàn)[4]。SystemVABI的主要參考標準包括:目標系統(tǒng)處理器的體系結(jié)構(gòu)手冊SystemVInterfaceDefinition(接口定義),4版IEEEPOSIX1003.1-1990標準操作系統(tǒng)規(guī)范X/OpenCommonApplicationEnvironmentSpecification(CAE),Issue4.2InternationalISO/IEC9899:1990(E),ProgrammingLanguages–C,12/15/90.XWindowSystem?XRelease5,圖形用戶界面規(guī)范LSB由于我們所關(guān)心的主要是Linux平臺上目標文件的格式,所以Linux標準LSB(LinuxStandardBase)LSBLinux發(fā)布版本之ABI類似,也由兩個部分組成:gLSB(GenericLSB)適用于所有體系結(jié)構(gòu)archLSB(ArchitectureLSB)LSB目前,LSB由SourceForge開放源碼項目社區(qū)提供支持。ELF文件格式簡介目標文件有三種類型:(RelocatableFile)包含適合于與其他目標文件鏈接來創(chuàng)建可執(zhí)行文件或者共享目標文件的代碼和數(shù)據(jù)??蓤?zhí)行文件(ExecutableFile)包含適合于執(zhí)行的一個程序,此文件規(guī)定了exec()(SharedObjectFile)包含可在兩種上下文中鏈接的代碼和數(shù)生成另外一個目標文件。其次,動態(tài)鏈接器(DynamicLinker)可能將它與某個可執(zhí)行文件以及其它共享目標一起組合,創(chuàng)建進程映像。目標文件全部是程序的二進制表示,目的是直接在某種處理器上直接執(zhí)行。3.1.1目標文件中的數(shù)據(jù)表示8位字節(jié)/32器上創(chuàng)建。表1ELF中常用數(shù)據(jù)格式名稱大小對齊目的Elf32_Addr44無符號程序地址Elf32_Half22無符號中等整數(shù)Elf32_Off44無符號文件偏移Elf32_SWord44有符號大整數(shù)Elf32_Word44無符號大整數(shù)unsignedchar11無符號小整數(shù)目標文件中的所有數(shù)據(jù)結(jié)構(gòu)都遵從“自然”44文件內(nèi)部。目標文件格式格式提供了兩種并行視圖,分別反映了這些活動的不同需求。圖1目標文件格式鏈接視圖 執(zhí)行視圖ELF頭部ELF頭部程序頭部表(可選)程序頭部表節(jié)區(qū)1段1...節(jié)區(qū)n段2節(jié)區(qū)頭部表節(jié)區(qū)頭部表(可選)文件開始處是一個ELF頭部(ELFHeader,用來描述整個文件的組織。節(jié)區(qū)部分包含鏈接視圖的大量信息:指令、數(shù)據(jù)、符號表、重定位信息等等。(ProgramHeaderabl注意:盡管圖中顯示的各個組成部分是有順序的,實際上除了ELF頭部表以外,其他節(jié)區(qū)和段都沒有規(guī)定的順序節(jié)區(qū)頭部表(SectionHeade注意:盡管圖中顯示的各個組成部分是有順序的,實際上除了ELF頭部表以外,其他節(jié)區(qū)和段都沒有規(guī)定的順序ELFHeader部分獨立于文件中的其余內(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[]標識索引名稱取值目的EI_MAG00文件標識EI_MAG11文件標識EI_MAG22文件標識EI_MAG33文件標識EI_CLASS4文件類EI_DATA5數(shù)據(jù)編碼EI_VERSION6文件版本EI_PAD7補齊字節(jié)開始處EI_NIDENT16e_ident[]大小這些索引訪問包含以下數(shù)值的字節(jié):表3e_ident[]的內(nèi)容說明索引說明EI_MAG0到EI_MAG3魔數(shù)(MagicNube,標志此文件是一個ELF標文件。名稱 取值 位置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標識文件的類別,或者說,容量名稱 取值位置ELFCLASSNONE0 非法類別ELFCLASS32 1 32位目標ELFCLASS64 2 64位目標ELFCLASS324GB。ELFCLASS6464位預64位定義。EI_DATA字節(jié)e_ident[EI_DATA]給出處理器特定數(shù)據(jù)的數(shù)據(jù)編碼方式。名稱 取值位置0 非法數(shù)據(jù)編碼1 高位在前2 低位在前EI_VERSIONELF頭部的版本號碼,不前此值必須是EV_CURRENT。EI_PADe_ident中未使用字節(jié)的開始。初始化為0。32Intel體系結(jié)構(gòu)上要求:132Intel體系結(jié)構(gòu)上要求:1、標志2、處理器標識(e_machine)成員必須是EM_386。位置取值e_ident[EI_CLASS]ELFCLASS32e_ident[EI_DATA]ELFDATA2LSBELFHeader4:表4ELFHeader中各個字段的含義成員說明e_ident目標文件標識e_type目標文件類型:名稱 取值 含義ET_NONE 0 未知目標文件格式ET_REL 1 可重定位文件ET_EXEC 2 可執(zhí)行文件ET_DYN 3 共享目標文件ET_CORE 4 Core文件(轉(zhuǎn)儲格式ET_LOPROC 0xff00 特定處理器文件ET_HIPROC 特定處理器文件ET_LOPROC和ET_HIPROC之間的取值用來標識與處理器相關(guān)的文件格式。e_machine給出文件的目標體系結(jié)構(gòu)類名稱 取值含義EM_NONE0 未指定EM_M32 1 WE321002 EM_386 3 Intel80386EM_68K 4 Motorola68000EM_88K 5 Motorola88000EM_860 7 Intel80860EM_MIPS 8 MIPSELF名稱會使用機器名來進行區(qū)分。e_version目標文件版本名稱 取值含義EV_NONE 0 非法版本EV_CURRENT1 當前版本e_entry程序入口的虛擬地址。如果目標文件沒有程序入口,可以為0。e_phoff程序頭部表格(ProgramHeader的偏移量(按字節(jié)計算。如果文件沒有程序頭部表格,可以為0。e_shoff(SectionHeader(按字節(jié)計算沒有節(jié)區(qū)頭部表格,可以為0。e_flagsEF_machine_flag的格式。e_ehsizeELF頭部的大小(以字節(jié)計算。e_phentsize程序頭部表格的表項大小(按字節(jié)計算。e_phnum程序頭部表格的表項數(shù)目??梢詾?。e_shentsize節(jié)區(qū)頭部表格的表項大?。ò醋止?jié)計算。e_shnum節(jié)區(qū)頭部表格的表項數(shù)目。可以為0。e_shstrndx節(jié)區(qū)頭部表格中與節(jié)區(qū)名稱字符串表相關(guān)的表項的索引。如果文件沒有節(jié)區(qū)名稱字符串表,此參數(shù)可以為SHN_UNDEF。節(jié)區(qū)(Sections)節(jié)區(qū)中包含目標文件中的所有信息,除了:ELF頭部、程序頭部表格、節(jié)區(qū)頭部表格。節(jié)區(qū)滿足以下條件:味著有節(jié)區(qū)。每個節(jié)區(qū)占用文件中一個連續(xù)字節(jié)區(qū)域(這個區(qū)域可能長度為0。文件中的節(jié)區(qū)不能重疊,不允許一個字節(jié)存在于兩個節(jié)區(qū)中的情況發(fā)生。目標文件中可能包含非活動空間(EE。這些區(qū)域不屬于任何頭部和節(jié)區(qū),其內(nèi)容未指定。節(jié)區(qū)頭部表格ELF頭部中,e_shoff成員給出從文件頭到節(jié)區(qū)頭部表格的偏移字節(jié)數(shù);e_shnum節(jié)區(qū)頭部表格中比較特殊的幾個下標如下:表5節(jié)區(qū)頭部表格中的特殊下標名稱取值說明SHN_UNDEF0標記未定義的、缺失的、不相關(guān)的,或者沒有含義的節(jié)區(qū)引用SHN_LORESERVEOXFF00保留索引的下界SHN_LOPROC0XFF00保留給處理器特殊的語義SHN_HIPROC0XFF1FSHN_ABSOXFFF1包含對應引用量的絕對取值。這些值不會被重定位所影響SHN_COMMONOXFFF2相對于此節(jié)區(qū)定義的符號是公共符號。如FORTRANCOMMONC外部變量。SHN_HIRESERVE0XFFFF保留索引的上界SHN_HIRESERVE之間的表項不會出現(xiàn)在節(jié)區(qū)頭部表中。節(jié)區(qū)頭部每個節(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;對其中各個字段的解釋如下:表6節(jié)區(qū)頭部字段說明成員說明sh_name給出節(jié)區(qū)名稱。是節(jié)區(qū)頭部字符串表節(jié)區(qū)(SectionHeaderStringTableSection)的索引。名字是一個NULL結(jié)尾的字符串。sh_type為節(jié)區(qū)的內(nèi)容和語義進行分類。參見節(jié)區(qū)類型。sh_flags1位形式的標志,這些標志描述了多種屬性。sh_addr如果節(jié)區(qū)將出現(xiàn)在進程的內(nèi)存映像中,此成員給出節(jié)區(qū)的第一個字節(jié)應處的位置。否則,此字段為0。sh_offset此成員的取值給出節(jié)區(qū)的第一個字節(jié)與文件頭之間的偏移。不過,SHT_NOBITSsh_offset成員給出的是其概念性的偏移。sh_size此成員給出節(jié)區(qū)的長度(字節(jié)數(shù)。除非節(jié)區(qū)的類型是SHT_NOBITS,否則節(jié)區(qū)占用文件中的sh_size字節(jié)。類型為SHT_NOBITSsh_link此成員給出節(jié)區(qū)頭部表索引鏈接。其具體的解釋依賴于節(jié)區(qū)類型。sh_info此成員給出附加信息,其解釋依賴于節(jié)區(qū)類型。sh_addralign某些節(jié)區(qū)帶有地址對齊約束。例如,如果一個節(jié)區(qū)保存一個doubleword,那么系統(tǒng)必須保證整個節(jié)區(qū)能夠按雙字對齊。sh_addr對sh_addralign取模,結(jié)果必須為0。目前僅允許取值為0和2的冪次數(shù)。數(shù)值0和1表示節(jié)區(qū)沒有對齊約束。sh_entsize某些節(jié)區(qū)中包含固定大小的項目,如符號表。對于這類節(jié)區(qū),此成員給出每個表項的長度字節(jié)數(shù)。如果節(jié)區(qū)中并不包含固定長度表項的表格,此成員取值為0。索引為零(SHN_UNDEF)的節(jié)區(qū)頭部也是存在的,盡管此索引標記的是未定義的節(jié)區(qū)引用。這個節(jié)區(qū)的內(nèi)容固定如下:表7SHN_UNDEF(0)節(jié)區(qū)的內(nèi)容字段名稱取值說明sh_name0無名稱sh_typeSHT_NULL非活動sh_flags0無標志sh_addr0無地址sh_offset0無文件偏移sh_size0無尺寸大小sh_linkSHN_UNDEF無鏈接信息sh_info0無輔助信息sh_addralign0無對齊要求sh_entsize0無表項節(jié)區(qū)類型—sh_type節(jié)區(qū)類型定義如表8:

表8節(jié)區(qū)類型定義名稱取值說明SHT_NULL0此值標志節(jié)區(qū)頭部是非活動的,沒有對應的節(jié)區(qū)。此節(jié)區(qū)頭部中的其他成員取值無意義。SHT_PROGBITS1此節(jié)區(qū)包含程序定義的信息,其格式和含義都由程序來解釋。SHT_SYMTAB2此節(jié)區(qū)包含一個符號表。目前目標文件對每種類型的節(jié)區(qū)都只能包含一個,不過這個限制將來可能發(fā)生變化。一般,SHT_SYMTAB節(jié)區(qū)提供用于鏈接編輯(指ld而言)的符號,盡管也可用來實現(xiàn)動態(tài)鏈接。SHT_STRTAB3此節(jié)區(qū)包含字符串表。目標文件可能包含多個字符串表節(jié)區(qū)。SHT_RELA4(adn32Elf32_Rela個重定位節(jié)區(qū)。SHT_HASH5此節(jié)區(qū)包含符號哈希表。所有參與動態(tài)鏈接的目標都必須包含一個符號哈希表。目前,一個目標文件只能包含一個哈希表,不過此限制將來可能會解除。SHT_DYNAMIC6此節(jié)區(qū)包含動態(tài)鏈接的信息。目前一個目標文件中只能包含一個動態(tài)節(jié)區(qū),將來可能會取消這一限制。SHT_NOTE7此節(jié)區(qū)包含以某種方式來標記文件的信息。SHT_NOBITS8這種類型的節(jié)區(qū)不占用文件中的空間,其他方面和SHT_PROGBITS相似。盡管此節(jié)區(qū)不包含任何字節(jié),成員sh_offset中還是會包含概念性的文件偏移SHT_REL9(dd2位目標文件中的Elf32_rel類型。目標文件中可以擁有多個重定位節(jié)區(qū)。SHT_SHLIB10此節(jié)區(qū)被保留,不過其語義是未規(guī)定的。包含此類型節(jié)區(qū)的程序與ABI不兼容。SHT_DYNSYM11作為一個完整的符號表,它可能包含很多對動態(tài)鏈接而言不必要的符號。因此,目標文件也可以包含一個SHT_DYNSYM節(jié)區(qū),其中保存動態(tài)鏈接符號的一個最小集合,以節(jié)省空間。SHT_LOPROC0X70000000這一段(包括兩個邊界,是保留給處理器專用語義的。SHT_HIPROCOX7FFFFFFFSHT_LOUSER0X80000000此值給出保留給應用程序的索引下界。SHT_HIUSER0X8FFFFFFF此值給出保留給應用程序的索引上界。其它的節(jié)區(qū)類型是保留的。sh_flagssh_flags字段定義了一個節(jié)區(qū)中包含的內(nèi)容是否可以修改、是否可以執(zhí)行等信息。如果一個標志位被設(shè)置,則該位取值為1。未定義的各位都設(shè)置為0。表9節(jié)區(qū)頭部的sh_flags字段取值名稱取值SHF_WRITE0x1SHF_ALLOC0x2SHF_EXECINSTR0x4SHF_MASKPROC0xF0000000其中已經(jīng)定義了的各位含義如下:SHF_WRITE: 節(jié)區(qū)包含進程執(zhí)行過程中將可寫的數(shù)據(jù)。SHF_ALLOC: 0。SHF_EXECINSTR: 節(jié)區(qū)包含可執(zhí)行的機器指令。SHF_MASKPROC: 所有包含于此掩碼中的四位都用于處理器專用的語義。2003520035月PKU/SSDB-03-TR-005?北京大學信息科學技術(shù)學院操作系統(tǒng)實驗室第PAGE?北京大學信息科學技術(shù)學院操作系統(tǒng)實驗室第10頁共38頁sh_linksh_info根據(jù)節(jié)區(qū)類型的不同,sh_linksh_info的具體含義也有所不同:表10sh_link和sh_info字段解釋sh_typesh_linksh_infoSHT_DYNAMIC此節(jié)區(qū)中條目所用到的字符串表格的節(jié)區(qū)頭部索引0SHT_HASH此哈希表所適用的符號表的節(jié)區(qū)頭部索引0SHT_RELSHT_RELA相關(guān)符號表的節(jié)區(qū)頭部索引重定位所適用的節(jié)區(qū)的節(jié)區(qū)頭部索引SHT_SYMTABSHT_DYNSYM相關(guān)聯(lián)的字符串表的節(jié)區(qū)頭部索引最后一個局部符號(綁定STB_LOCAL)的符號表索引值加一其它SHN_UNDEF0特殊節(jié)區(qū)的類型和屬性。表11常見特殊節(jié)區(qū)名稱類型屬性含義.bssSHT_NOBITSSHF_ALLOC SHF_WRITE包含將出現(xiàn)在程序的內(nèi)存映像中的為初始0件空間。.commentSHT_PROGBITS(無)包含版本控制信息。.dataSHT_PROGBITSSHF_ALLOC +SHF_WRITE這些節(jié)區(qū)包含初始化了的數(shù)據(jù),將出現(xiàn)在程序的內(nèi)存映像中。.data1SHT_PROGBITSSHF_ALLOC +SHF_WRITE.debugSHT_PROGBITS(無)此節(jié)區(qū)包含用于符號調(diào)試的信息。.dynamicSHT_DYNAMIC此節(jié)區(qū)包含動態(tài)鏈接信息。節(jié)區(qū)的屬性將包SHF_ALLOCSHF_WRITE位被設(shè)置取決于處理器。.dynstrSHT_STRTABSHF_ALLOC此節(jié)區(qū)包含用于動態(tài)鏈接的字符串,大多數(shù)情況下這些字符串代表了與符號表項相關(guān)的名稱。.dynsymSHT_DYNSYMSHF_ALLOC此節(jié)區(qū)包含了動態(tài)鏈接符號表。.finiSHT_PROGBITSSHF_ALLOC SHF_EXECINSTR此節(jié)區(qū)包含了可執(zhí)行的指令,是進程終止代碼的一部分。程序正常退出時,系統(tǒng)將安排執(zhí)行這里的代碼。.gotSHT_PROGBITS此節(jié)區(qū)包含全局偏移表。.hashSHT_HASHSHF_ALLOC此節(jié)區(qū)包含了一個符號哈希表。.initSHT_PROGBITSSHF_ALLOC SHF_EXECINSTR碼開始調(diào)用主程序入口之前(通常指C的main函數(shù))執(zhí)行這些代碼。.interpSHT_PROGBITS么節(jié)區(qū)的屬性將包含SHF_ALLOC位,否則該位為0。.lineSHT_PROGBITS(無)此節(jié)區(qū)包含符號調(diào)試的行號信息,其中描述了源程序與機器指令之間的對應關(guān)系。其內(nèi)容是未定義的。.noteSHT_NOTE(無)此節(jié)區(qū)中包含注釋信息,有獨立的格式。.pltSHT_PROGBITS此節(jié)區(qū)包含過程鏈接表(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ù)通常參與進程映像的不可寫段。.rodata1SHT_PROGBITSSHF_ALLOC.shstrtabSHT_STRTAB此節(jié)區(qū)包含節(jié)區(qū)名稱。.strtabSHT_STRTAB此節(jié)區(qū)包含字符串符號表相關(guān)的名稱。如果文件擁有一個可加載的SHF_ALLOC位,否則該位為0。.symtabSHT_SYMTAB此節(jié)區(qū)包含一個符號表么節(jié)區(qū)的屬性中包含SHF_ALLOC該位置為0。.textSHT_PROGBITSSHF_ALLOC +SHF_EXECINSTR此節(jié)區(qū)包含程序的可執(zhí)行指令。在分析這些節(jié)區(qū)的時候,需要注意如下事項:目標文件格式允許人們定義不在上述列表中的節(jié)區(qū)。目標文件中也可以包含多個名字相同的節(jié)區(qū)。保留給處理器體系結(jié)構(gòu)的節(jié)區(qū)名稱一般構(gòu)成為:處理器體系結(jié)構(gòu)名稱簡寫+名稱。處理器名稱應該與e_machine中使用的名稱相同。例如.FOO.psect街區(qū)是由FOOpsect節(jié)區(qū)。稱,如:.sdata.tdesc.sbss.lit4.lit8.reginfo.gptab.liblist.conflict…字符串表(StringELF串表中的下標給出。(NULLNULL0的字符串在NULL的字符串。sh_size0。對空的字符串0的索引值是非法的。sh_nameELFe_shstrndx25個字節(jié)的一個字符串表,以及與不同索引相關(guān)的字符串。表12字符串表示例索引+0+1+2+3+4+5+6+7+8+90\0name.\0Var10iable\0able20\0\0xx\0表12中包含的字符串如下:索引字符串0(無)1name.7Variable11able16able24(空字符串)在使用、分析字符串表時,要注意以下幾點:字符串表索引可以引用節(jié)區(qū)中任意字節(jié)。字符串可以出現(xiàn)多次可以存在對子字符串的引用同一個字符串可以被引用多次。字符串表中也可以存在未引用的字符串。符號表(Symbol0符號表項的格式如下:圖4符號表項格式定義typedefstruct{Elf32_Wordtypedefstruct{Elf32_Word st_name;Elf32_Addr Elf32_Word st_size;unsignedchar st_info;unsignedchar Elf32_Half st_shndx;}Elf32_sym;其中各個字段的含義說明如表13:表13符號表項字段字段說明st_name有名稱。C符號在C語言和目標文件的符號表中具有相同的名稱。st_value此成員給出相關(guān)聯(lián)的符號的取值。依賴于具體的上下文,它可能是一個絕對值、一個地址等等。st_size很多符號具有相關(guān)的尺寸大小。例如一個數(shù)據(jù)對象的大小是對象中包含的字節(jié)數(shù)。如果符號沒有大小或者大小未知,則此成員為0。st_info此成員給出符號的類型和綁定屬性。下面給出若干取值和含義的綁定關(guān)系。st_other該成員當前包含0,其含義沒有定義。st_shndx每個符號表項都以和其他節(jié)區(qū)間的關(guān)系的方式給出定義。此成員給出相關(guān)的節(jié)區(qū)頭部表索引。某些索引具有特殊含義。st_info的說明st_info中包含符號類型和綁定信息,操縱方式如:圖5符號表項的st_info字段合成#define#defineELF32_ST_BIND(i)#defineELF32_ST_TYPE(i)((i)>>4)((i)&0xf)#defineELF32_ST_INFO(b,t)(((b)<<4)+((t)&0xf))的綁定類型如:表14符號的綁定類型名稱取值說明STB_LOCAL0局部符號在包含該符號定義的目標文件以外不可見。相同名稱的局部符號可以存在于多個文件中,互不影響。STB_GLOBAL1全局符號對所有將組合的目標文件都是可見的。一個文件中對某個全局符號的定義將滿足另一個文件對相同全局符號的未定義引用。STB_WEAK2弱符號與全局符號類似,不過他們的定義優(yōu)先級比較低。STB_LOPROC13處于這個范圍的取值是保留給處理器專用語義的。STB_HIPROC15全局符號與弱符號之間的區(qū)別主要有兩點:當鏈接編輯器組合若干可重定位的目標文件時,不允許對同名的STB_GLOBAL另一方面如果一個已定義的全局符號已經(jīng)存在,出現(xiàn)一個同名的弱符號并不會產(chǎn)生錯誤。鏈接編輯器盡關(guān)心全局符號,忽略弱符號。類似地,如果一個公共符號(符號的st_shndx中包含SHN_COMMON,那么具有相同名稱的弱符號出現(xiàn)也不會導致錯誤。鏈接編輯器會采納公共定義,而忽略弱定義。當鏈接編輯器搜索歸檔庫(archivelibraries)義全局符號的檔案成員。成員的定義可以是全局符號,也可以是弱符號。連接編輯器不會提取檔案成員來滿足未定義的弱符號。未能解析的弱符號取值為0。在每個符號表中,所有具有STB_LOCAL綁定的符號都優(yōu)先于弱符號和全局符sh_info頭部成員包含第一個非局部符號的符號表索引。符號類型符號類型(ELF32_ST_TYPE)定義如下:表15符號類型名稱取值說明STT_NOTYPE0符號的類型沒有指定STT_OBJECT1符號與某個數(shù)據(jù)對象相關(guān),比如一個變量、數(shù)組等等STT_FUNC2符號與某個函數(shù)或者其他可執(zhí)行代碼相關(guān)STT_SECTION3符號與某個節(jié)區(qū)相關(guān)。這種類型的符號表項主要用于重定位,通常具有STB_LOCAL綁定。STT_FILE4稱。文件符號具有STB_LOCAL綁定,其節(jié)區(qū)索引是L符號(如果有的話)STT_LOPROC13此范圍的符號類型值保留給處理器專用語義用途。STT_HIPROC15在共享目標文件中的函數(shù)符號(類型為STT_FUNC)具有特別的重要性。當其他程鏈接表項。類型不是STT_FUNC的共享目標符號不會自動通過過程鏈接表進行引用。如果一個符號的取值引用了某個節(jié)區(qū)中的特定位置,那么它的節(jié)區(qū)索引成員(st_shndx)包含了其在節(jié)區(qū)頭部表中的索引。當節(jié)區(qū)在重定位過程中被移動時,符號的取值也會隨之變化,對符號的引用始終會“指向”程序中的相同位置。特殊的節(jié)區(qū)索引某些特殊的節(jié)區(qū)索引具有不同的語義:SHN_ABS:符號具有絕對取值,不會因為重定位而發(fā)生變化。SHN_COMMON:符號標注了一個尚未分配的公共sh_addralignst_valueSHN_UNDEF: 當鏈接編輯器將此目標文件與其他定義了該符號的目標STN_UNDEF符號表16STN_UNDEF符號名稱取值說明st_name0無名稱st_value00值st_size0無大小st_info0無類型,局部綁定st_other0無附加信息st_shndx0無節(jié)區(qū)符號取值不同的目標文件類型中符號表項對st_value成員具有不同的解釋:在可重定位文件中,st_value中遵從了節(jié)區(qū)索引為SHN_COMMON的符號的對齊約束。st_value是從st_shndx所標識的節(jié)區(qū)頭部開始計算,到符號位置的偏移。在可執(zhí)行和共享目標文件中,st_value包含一個虛地址。為了使得這些文件的符號對動態(tài)鏈接器更有用,節(jié)區(qū)偏移(針對文件的解釋)虛擬地址(針對內(nèi)存的解釋,因為這時與節(jié)區(qū)號無關(guān)。數(shù)據(jù)訪問方式。重定位信息相關(guān)的調(diào)用指令必須把控制傳輸?shù)竭m當?shù)哪繕藞?zhí)行地址。重定位表項標文件保存進程的程序映像的正確信息。重定位表項就是這樣一些數(shù)據(jù)。重定位表項的格式如圖6:圖6重定位表項的格式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;其中,各個字段的說明如下表:表17重定位表項字段說明成員說明r_offset此值是從節(jié)區(qū)頭部開始到將被重定位影響的存儲單位之間的字節(jié)偏移。對于可執(zhí)行文件或者共享目標文件而言,其取值是被重定位影響到的存儲單元的虛擬地址。r_info此成員給出要進行重定位的符號表索引,以及將實施的重定位類型。索引是STN_UNDEF,那么重定位使用0作為“符號值”。重定位類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的表項在將被修改的位置保存隱式的補齊信息。依賴于處理器體系結(jié)構(gòu),各種形式都可能sh_infosh_linkr_offset同的解釋。在可重定位文件中,r_offset中包含節(jié)區(qū)偏移。就是說重定位節(jié)區(qū)自身一個存儲單元。在可執(zhí)行文件和共享的目標文件中,r_offset中包含一個虛擬地址。為(件的解釋)讓位于虛地址(針對內(nèi)存的解釋。r_offset的解釋會有少許不同,重定位類型的含義始終不變。重定位類型重定位表項描述如何修改后面的指令和數(shù)據(jù)字段。一般,共享目標文件在創(chuàng)建時,其基本虛擬地址是0,不過執(zhí)行地址將隨著動態(tài)加載而發(fā)生變化。重定位的過程,按照如下標記:A用來計算可重定位字段的取值的補齊。B共享目標在執(zhí)行過程中被加載到內(nèi)存中的位置(基地址。G表的索引。GOT全局偏移表(GOT)的地址。L某個符號的過程鏈接表項的位置(節(jié)區(qū)偏移/地址。過程鏈接表項接表,動態(tài)鏈接器在執(zhí)行過程中修改這些項目。P(r_offset計算(址。S其索引位于重定位項中的符號的取值。重定位項的r_offset取值給定受影響的存儲單位的第一個字節(jié)的偏移或者虛擬地址。重定位類型給出那些位需要修改以及如何計算它們的取值。SYSTEMVElf32_RelX86體系結(jié)構(gòu)下常見的重定位類型:表18x86體系結(jié)構(gòu)下常見的重定位類型名稱數(shù)值字段計算說明R_386_NONE0(無)(無)R_386_321word32S+AR_386_PC322word32S+A-PR_386_GOT323word32G+A-P此重定位類型計算從全局偏移表基址到符號的全局偏移表項之間的距離。它會通知連接編輯器構(gòu)造一個全局偏移表。R_386_PLT324word32L+A-P此重定位類型計算符號的過程鏈接表項的地質(zhì),并通知鏈接編輯器構(gòu)造一個過程鏈接表。R_386_COPY5(無)(無)鏈接編輯器創(chuàng)建這種重定位類型的目的是支于當前目標文件中,也存在于某個共享目標的符號相關(guān)的數(shù)據(jù)復制到由偏移給出的位置。R_386_GLOB_DAT6word32S此重定位類型用來把某個全局偏移表項設(shè)置為給定符號的地址。這種特殊的重定位類型允許確定符號與全局偏移表項之間的關(guān)系。R_386_JMP_SLOT7word32S鏈接編輯器創(chuàng)建這種重定位類型主要是為了內(nèi)容,把控制傳輸給指定符號的地址。R_386_RELATIVE8word32B+A鏈接編輯器創(chuàng)建這種重定位類型是為了支持的虛地址和相對地址相加,計算對應的虛地為0。R_386_GOTOFF9word32S+A-GOT這種重定位類型會計算符號取值與全局偏移表地址間的差。并通知鏈接編輯器創(chuàng)建一個全局偏移表。R_386_GOTPC10word32GOT+A-P此重定位類型與R_386_PC32類似,只不過位項中引用的符號通常是暗示連接編輯器構(gòu)造全局偏移表。程序加載和動態(tài)鏈接實現(xiàn)程序加載和動態(tài)鏈接的主要技術(shù)有:(mr用來在文件中定位各個段的映像。同時包含其他一些用來為程序創(chuàng)建進程映像所必需的信息。程序加載:給定一個目標文件,系統(tǒng)加載該文件到內(nèi)存中,啟動程序執(zhí)行。號引用,以便完整地構(gòu)造進程映像。程序頭部(ProgramHeader)也就是“段內(nèi)容(Segments。程序頭部僅對于可執(zhí)行文件和共享目標文件有意義。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)其中各個字段說明如下:p_type 19。p_offset 此成員給出從文件頭到該段第一個字節(jié)的偏移。p_vaddr 此成員給出段的第一個字節(jié)將被放到內(nèi)存中的虛擬地址。p_paddrSystemV文件而言具體內(nèi)容是未指定的。p_filesz 0。p_memsz 0。p_flags 此成員給出與段相關(guān)的標志。p_align 可加載的進程段的p_vaddr和p_offset取值必須合適,相對段類型

對齊。數(shù)值0和1表示不需要對齊。否則p_align應該是個2p_offsetp_align取模后應該相等。可執(zhí)行ELF目標文件中的段類型如表19所示:表19段類型名字取值說明PT_NULL0此數(shù)組元素未用。結(jié)構(gòu)中其他成員都是未定義的。PT_LOAD1此數(shù)組元素給出一個可加載的段,段的大小由p_filesz和p_memsz描述。文件中的字節(jié)被映射到內(nèi)存段開始處。如果p_memsz大于p_filesz,“剩余”的字節(jié)要清零。p_filesz不能大于p_memsz??杉虞dp_vaddr成員按升序排列。PT_DYNAMIC2數(shù)組元素給出動態(tài)鏈接信息。PT_INTERP3NULL當作解釋器調(diào)用。這種段類型僅對與可執(zhí)行文件有意義(盡管也可能在共享目標文件上發(fā)生這種類型的段,它必須在所有可加載段項目的前面。PT_NOTE4此數(shù)組元素給出附加信息的位置和大小。PT_SHLIB5此段類型被保留,不過語義未指定。包含這種類型的段的程序與ABI不符。PT_PHDR6既包括在文件中也包括在內(nèi)存中的信息。此類型的段在文件中不能出現(xiàn)一次以上。并且只有程序頭部表是程序的內(nèi)存映像的一部分時才起作用。如果存在此類型段,則必須在所有可加載段項目的前面。PT_LOPROC0x70000000此范圍的類型保留給處理器專用語義。PT_HIPROC0x7fffffff基地址(BaseAddress)是在執(zhí)行過程中從三個數(shù)值計算的:內(nèi)存加載地址最大頁面大小程序的可加載段的最低虛地址。PT_LOADp_vaddrp_vaddr相同也可能不同。“.bssSHT_NOBITSp_memszp_filesz注釋節(jié)區(qū)(NoteSection)SHT_NOTEPT_NOTE4例如:nameszdescsztypename...desc...圖8注釋節(jié)區(qū)示例其中:nameszname注釋信息的name部分前namesz字節(jié)包含一個NULL中04namesz中。descszdescdescdescsz字節(jié)包含注釋信息的描述。ABI對此沒有作出約束。如果需要,可以用補零來確保4字節(jié)descsz中。type word取值必須非負。ABI并不定義描述符的含義[3]。程序加載須具有這樣的段:其文件偏移和虛擬地址對頁面大小取模后余數(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在這個例子中,至多四個文件頁面包含非純粹的正文或者數(shù)據(jù)。(1).第一個頁面中包含ELF頭部、程序頭部表、以及其它信息(2).最后一個頁面包含數(shù)據(jù)開始部分的一個副本第一數(shù)據(jù)頁面包含正文段的末尾部分最后一個數(shù)據(jù)頁面可能包含與運行進程無關(guān)的文件信息不過系統(tǒng)對這些頁面一般會做兩次映射,以保證每個段的內(nèi)存訪問許可是相同的。數(shù)據(jù)段的末尾需要對未初始化數(shù)據(jù)進行特殊處理,系統(tǒng)應該將這些初始化為0。p_vaddr另外,共享目標文件的段通常包含與位置無關(guān)的代碼。這使得段的虛擬地址在不同的進程中不同,但不影響執(zhí)行行為。盡管系統(tǒng)為每個進程選擇獨立的虛擬地址,仍能維持段的相對位置。因為位置獨立的代碼在段與段之間使用相對尋址,內(nèi)存虛地址之間的差異必須與文件中虛擬地址之間的差異相匹配。位問題。表21虛擬地址指定方案示例源正文數(shù)據(jù)基地址文件0x2000x2a4000x0進程10x800002000x8002a4000x80000000進程20x800812000x800ab4000x80081000進程30x900c02000x900ea4000x900c0000進程40x900c62000x900f04000x900c6000動態(tài)鏈接程序解釋器可執(zhí)行文件可以包含PT_INTERP程序頭部元素。在exec()期間,系統(tǒng)從PT_INTERP段中檢索路徑名,并從解釋器文件的段創(chuàng)建初始的進程映像。也就是說,解釋器可以有兩種方式接受控制。接受一個文件描述符,讀取可執(zhí)行文件并將其映射到內(nèi)存中供一個已經(jīng)打開的文件描述符。解釋器可以是一個可執(zhí)行文件,也可以是一個共享目標文件。在mmap以及相關(guān)服務(wù)所使用的動態(tài)段區(qū)域創(chuàng)建共享目標文件的段。因此,共享目標解釋器通常不會與原來的可執(zhí)行文件的原始段地址發(fā)生沖突。生沖突。解釋器要負責解決這種沖突。動態(tài)加載程序PT_INTERP統(tǒng)所提供的動態(tài)鏈接器的位置是和處理器相關(guān)的。Exec()(1).把共享目標內(nèi)存段添加到進程映像中;為可執(zhí)行文件和它的共享目標執(zhí)行重定位操作;關(guān)閉用來讀入可執(zhí)行文件的文件描述符,如果動態(tài)鏈接程序收到過這樣的文件描述符的話;exec直接得到控制。鏈接編輯器也會構(gòu)造很多數(shù)據(jù)來協(xié)助動態(tài)鏈接器處理可執(zhí)行文件和共享目標文件。這些數(shù)據(jù)包含在可加載段中,在執(zhí)行過程中可用。如:類型為SHT_DYNAMIC的.dynamic節(jié)區(qū)包含很多數(shù)據(jù)。位于節(jié)區(qū)頭部的結(jié)構(gòu)保存了其他動態(tài)鏈接信息的地址。SHT_HASH的.hash節(jié)區(qū)包含符號哈希表。SHT_PROGBITS.got.plt程鏈接表。因為任何符合ABI規(guī)范的程序都要從共享目標庫中導入基本的系統(tǒng)服務(wù),動態(tài)鏈接器會參與每個符合ABI規(guī)范的程序的執(zhí)行。動態(tài)節(jié)區(qū)PT_DYNAMIC.dynamic_DYNAMIC含如下結(jié)構(gòu)的數(shù)組。圖10動態(tài)節(jié)區(qū)符號結(jié)構(gòu)typedefstruct{Elf32_Swordd_tag;union{typedefstruct{Elf32_Swordd_tag;union{Elf32_Word Elf32_Addr }d_un;}Elf32_Dyn;externElf32_Dyn _DYNAMIC[];對每個這種類型的對象,d_tag控制d_un的解釋含義:d_valElf32_Word對象表示一個整數(shù)值,可以有多種解釋。d_ptr此Elf32_Addr對象代表程序的虛擬地址。如前所述,文件的虛擬地址可能與執(zhí)行過程中的內(nèi)存虛地址不匹配。在解釋包含于動態(tài)結(jié)構(gòu)中的地址時,動態(tài)鏈接程序基于原來文件值和內(nèi)存基地址計算實際地址。為了保持一致性,文件中不包含用來“糾正”動態(tài)結(jié)構(gòu)中重定位項地址的重定位項目。下面的表格總結(jié)了可執(zhí)行文件和共享目標文件對標志的要求。如果標志被標記為I規(guī)范的文件的動態(tài)鏈接數(shù)組必須包含一個該類型表項意味著該標志可以出現(xiàn),但不是必需的。表22動態(tài)項標志說明名稱數(shù)值d_un可執(zhí)行共享目標說明DT_NULL0忽略必需必需標記為DT_NULL的項目標注了整個_DYNAMIC數(shù)組的末端。DT_NEEDED1d_val可選可選此元素包含一個NULL結(jié)尾的字符串的字符串表DT_STRTAB有很大關(guān)系。DT_PLTRELSZ2d_val可選可選此元素給出了與過程鏈接表(PLT)位項的總計大?。ò醋止?jié)DT_JMPRELDT_PLTRELSZ目。DT_PLTGOT3d_ptr可選可選與/或全局偏移表相關(guān)聯(lián)的一個地址。DT_HASH4d_ptr必需必需DT_SYMTAB元素引用的符號表。DT_STRTAB5d_ptr必需必需他字符串都包含在此表中。DT_SYMTAB6d_ptr必需必需32這個符號表中的條目是Elf32_Sym類型。DT_RELA7d_ptr必需可選32Elf32_Rela。目存在,動態(tài)結(jié)構(gòu)必須也包含DT_RELASZ和DT_RELAENTDT_RELADT_REL都可能存在(二者都是允許存在但不要求存在的。DT_RELASZ8d_val必需可選此元素包含DT_RELA重定位表的大?。ò醋止?jié)數(shù)計算。DT_RELAENT9d_val必需可選此元素包含DT_RELA重定位項的大?。ò醋止?jié)計算。DT_STRSZ10d_val必需必需此元素給出字符串表的大小,按字節(jié)數(shù)計算。DT_SYMENT11d_val必需必需此元素給出符號表項的大小,按字節(jié)數(shù)計算。DT_INIT12d_ptr可選可選此元素包含初始化函數(shù)的地址。DT_FINI13d_ptr可選可選(Termination的地址。DT_SONAME14d_val忽略可選此元素給出一個NULL結(jié)尾的字符串的字符串表DT_STRTABDT_RPATH15d_val可選忽略NULLDT_STRTAB項目所記錄的表格的索引。DT_SYMBOLIC16忽略忽略可選行文件和其他共享目標。DT_REL17d_ptr必需可選DT_RELA32Elf32_RelDT_RELSZ和DT_RELENT元素。DT_RELSZ18d_val必需可選DT_REL數(shù)計算。DT_RELENT19d_val必需可選DT_REL算。DT_PLTREL20d_val可選可選此成員給出過程鏈接表所引用的重定位項的類型。根據(jù)具體情況,d_val成員包含DT_REL或者DT_RELA。過程鏈接表中的所有重定位都必須采用相同的重定位方式。DT_DEBUG21d_ptr可選忽略ABI目的程序與ABI不兼容。DT_TEXTREL22忽略可選可選此可以作相應的準備。DT_JMPREL23d_ptr可選可選d_ptr行。如果存在此成員,相關(guān)的DT_PLTRELSZ和DT_PLTREL必須也存在。DT_LOPROC0x70000000未指定未指定未指定這個范圍的表項,包括DT_LOPROC和DT_HIPROC都是保留給處理器特定的語義的。DT_HIPROC0x7fffffff未指定未指定未指定注:沒有出現(xiàn)在此表中的標記值是保留的。除了數(shù)組末尾的DT_NULL元素以及DT_NEEDED元素的相對順序約束以外,其他項目可以以任意順序出現(xiàn)。共享目標的依賴關(guān)系描述了它們的特定的依賴關(guān)系。在動態(tài)鏈接器為某個目標文件創(chuàng)建內(nèi)存段時,依賴關(guān)系(記錄于動態(tài)結(jié)構(gòu)的DT_NEEDED表項中)能夠提供需要哪些目標來提供程序服務(wù)的信息。通過不斷地將DT_NEEDED(按順序)DT_NEEDED即使某個共享目標在依賴表中出現(xiàn)多次,動態(tài)鏈接器也僅會對其連接一次。DT_SONAMElib1的DT_SONAME項,并且使用了路徑名為/usr/llib/lib2的共lib1/usr/lib/lib2。(/串作為路徑名稱。如果名稱中沒有斜線,則對共享目標的路徑搜索按如下順序進行::”分隔,用來通知動態(tài)鏈接器從哪里開始搜索。默認情況下最后搜索當前目錄。的變量,其中也包含若干都在之后被搜索。盡管某些程序?qū)Ψ痔柷昂蟮牧斜淼奶幚碛兴煌?,動態(tài)鏈接程序并不這樣,它能夠接受分號,語義如上。/usr/lib搜索。注意:注意:SUIDSGID的程序忽略環(huán)境搜索規(guī)范(如_。不過仍然會搜索和/usr/lib路徑。全局偏移表(GOT)對位置。以后,動態(tài)鏈接器要處理重定位項,其中有一些重定位項的類型是R_386_GLOB_DAT,地址。重定位,因而確保了執(zhí)行過程中絕對地址信息可用。0_DYNAMIC32Intel12也是保留的。變其地址。只有進程存在,其內(nèi)存段都位于固定的虛地址。externElf32_Addr_GLOBAL_OFFSET_TABLE[];32Intel體系結(jié)構(gòu)而言,_GLOBAL_OFFSET_TABLE_可以用來訪問該表。externElf32_Addr_GLOBAL_OFFSET_TABLE[];_GLOBAL_OFFSET_TABLE_.got節(jié)區(qū)的中間,允許使用負的/非負的下標來訪問地址數(shù)組。過程鏈接表全局偏移表(GO)用來將位置獨立的地址計算重定向到絕對位置,與此相似,析從一個可執(zhí)行文件/共享目標到另一個可執(zhí)行文件/共享目標控制轉(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絕對過程鏈接表.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位置獨立的過程鏈接表((用不同的操作數(shù)尋址模式。盡管如此,它們對動態(tài)鏈接器的接口還是相同的。特殊值。%bx表的基址寄存器。name1,name1.PLT1。name1pushl指令的地址,而不是name1的真實地址。接下來,程序?qū)⒅囟ㄎ黄疲╫ffset)32R_386_JMP_SLOT,jmpGOTname1。.PLT0,也就是過程鏈接表的第一項。pushl(got_plus_44(%ebx))GOT存的地址(got_plus_8或者8(%ebx),后者將控制傳遞給動態(tài)鏈接器。name1name1,不會再次調(diào)用動態(tài)鏈接.PLT1處的jmp將控制傳遞給name1pushl令。LD_BIND_NOWR_386_JMP_SLOT行懶惰計算,延遲符號解析和重定位,直到某個表項的第一次執(zhí)行。哈希表(Hash由Elf32_Word對象組成的哈希表支持符號表訪問。下面的例子有助于解釋哈希表組織,不過不是規(guī)范的一部分。圖13符號哈希表的組織nbucketnchainbucket[0]...bucket[nbucket-1]chain[0]...chain[nchain-a]bucket數(shù)組包含nbucket個項目,chain數(shù)組包含nchain個項目,下標都是從0bucketchainChainnchainchain表項。哈希bucket的索引。因此,如果哈希函數(shù)針對某個名字返回了數(shù)值X,則bucket[X%nbucket]給出了chainchain[y]chain鏈一直搜索,直到所選中的符號表項包含了所需要的符號,或者chain項中包含值STN_UNDEF。哈希函數(shù)F實現(xiàn)中常用的哈希函數(shù)如下,有時候會作一些優(yōu)化(比如Linu。unsignedlongunsignedlongelf_hash

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論