培訓(xùn)課件及課7 elf文件格式中文三_第1頁(yè)
培訓(xùn)課件及課7 elf文件格式中文三_第2頁(yè)
培訓(xùn)課件及課7 elf文件格式中文三_第3頁(yè)
培訓(xùn)課件及課7 elf文件格式中文三_第4頁(yè)
培訓(xùn)課件及課7 elf文件格式中文三_第5頁(yè)
已閱讀5頁(yè),還剩8頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

xfocusxfocusxfocus添加文章English首頁(yè)焦 安 安全工具安 焦點(diǎn)項(xiàng)目焦 添加文章English文章提交:alert7 ====================DynamicLinking(動(dòng) )一個(gè)可執(zhí)行文件可能有一個(gè)PT_INTERP程序頭元素。在exec(BA_OS)過(guò)程中,系統(tǒng)從PT_INTERP段中取回一個(gè)路徑名并由解釋器文件的段創(chuàng)建初始的LSDRPC行ring0代碼LSDRPC行ring0代碼 系統(tǒng)在mmap(KE_OS)使用的動(dòng)態(tài)段域?yàn)樗鼊?chuàng)建段和相關(guān)的服務(wù)。因而,一個(gè) DynamicLinker(動(dòng) 器 器把一個(gè)PT_INTERP類型 Exec(BA_OS)和動(dòng)態(tài)器合作為程序創(chuàng)建進(jìn)程,必須有如下的動(dòng)作向程序傳遞控制,就象該程序已經(jīng)直接從exec(BA_OS)一個(gè)具有SHT_DYNAMIC類型的.dynamicsectionsection開(kāi)頭的結(jié)構(gòu)包含了其他動(dòng)態(tài)信息的地址SHT_HASH類型的.hashsectionsymbolhashSHT_PROGBITS類型的.got和.pltsection包含了兩個(gè)分離的全局偏移表和過(guò)程表。下面的section演示了動(dòng)態(tài)器使用和改變這些表來(lái)為objectfile創(chuàng)建內(nèi)存映像。ABI的程序從一個(gè)共享對(duì)象庫(kù)中輸入基本的系統(tǒng)服務(wù),因此動(dòng)態(tài)器于每一個(gè)遵循ABI的程序的執(zhí)行過(guò)程中。文件的程序頭表中的地址不同的虛擬內(nèi)存地址。動(dòng)態(tài)器重定位內(nèi)存映像,在應(yīng)用程序獲得控制之前更新絕對(duì)地址。盡管在庫(kù)被載入到由程序頭表指定的地址的情況下絕對(duì)地址應(yīng)當(dāng)是正確的,通常的情況卻不是這樣。如果進(jìn)程環(huán)境[seeexec(BA_OS)]LD_BIND_NOW其他情況下,LD_BIND_NOW或者不在環(huán)境中或者為空值。動(dòng)態(tài)器可以不急于"ProcedureLinkageTable"獲取的信息。DynamicSection(動(dòng)態(tài)的元素。該“段”包含了.dynamicsection。一個(gè)_DYNAMIC特別的符號(hào),表明了+Figure2-9:Dynamictypedefstruct{Elf32_Swordd_tag;union{Elf32_Swordd_val;Elf32_Addrd_ptr;}}externElf32_Dyn那些Elf32_Wordobject那些Elf32_odobject描繪了程序的虛擬地址。就象以前提到的,在執(zhí)行時(shí),文件的虛擬地址可能和內(nèi)存虛擬地址不匹配。當(dāng)解釋包含在動(dòng)態(tài)結(jié)構(gòu)中的地址時(shí)是基于原始文件的值和內(nèi)存的址。為了一致性,文件不包含在mandatory,ABI-conforming文件的動(dòng)態(tài)連接數(shù)組必須有一個(gè)那樣的。同樣的,“optional”意味著一個(gè)可能出現(xiàn)tag的,但是不是必須的。+Figure2-10:DynamicArrayTags, Value ExecutableShared ===== ========== 0ignoredmandatory DT_NEEDED1d_valoptional DT_PLTRELSZ2d_valoptional DT_PLTGOT3d_ptroptional DT_HASH4d_ptrmandatory mandatoryDT_STRTAB5d_ptrmandatory DT_SYMTAB6d_ptrmandatory DT_RELA7d_ptrmandatory DT_RELASZ8d_valmandatory optionalDT_RELAENT9d_valmandatory DT_STRSZ10d_valmandatory DT_SYMENT11d_valmandatory DT_INIT12d_ptroptional DT_FINI13d_ptr DT_SONAME14d_valignored DT_RPATH15d_valoptional DT_SYMBOLIC16ignoredignored DT_REL17d_ptrmandatory DT_RELSZ18d_valmandatory DT_RELENT19d_valmandatory DT_PLTREL20d_valoptional optionalDT_DEBUG21d_ptroptional ignoredDT_TEXTREL22ignoredoptional DT_JMPREL23d_ptroptional unspecifiedunspecifiedunspecified 0x7fffffffunspecifiedunspecifiedunspecified該偏移量是以DT_STRTAB為的表的索引。看“SharedObjectDependencies”關(guān)于那些名字的信息。動(dòng)態(tài)數(shù)組可能包含了多個(gè)這個(gè)類型的。那些的相關(guān)順序是重要的,雖然它們跟其他的關(guān)系是不重要的。(processorsupplement)被DT_SYMTAB元素的符號(hào)表。該元素保存著重定位表的地址,在第一部分有描述。在表中的有明確的加數(shù),就象32bit類型文件的El32_Rl。一個(gè)objet文件可能好多個(gè)重定位setion。當(dāng)為一個(gè)可執(zhí)行和共享文件建立重定位表的時(shí)候,連接編輯器連接那些setion到一個(gè)單一的表。盡管在objet文件中那些setion是保持獨(dú)立的。動(dòng)作。假如該元素存在,動(dòng)態(tài)結(jié)構(gòu)必須也要有DT_RELSZ和T_RELENT當(dāng)文件的重定位是mndtory,DT_RELA或者DT_REL可能出現(xiàn)(同時(shí)出現(xiàn)是 SharedObjectDependencies部分獲得 在共享object依賴關(guān)系(SharedObjectDependencies)中有討論在共享object庫(kù)中出現(xiàn)的該元素為在庫(kù)中的改變動(dòng)態(tài)連接器符號(hào)解析的算法。一個(gè)共享的object提供參考失敗,那么動(dòng)態(tài)連接器再照常的搜索可執(zhí)行文件該成員指明了PLT指向的重定位的類型。適當(dāng)?shù)?,d_val成員保存著該成員被調(diào)試使用。它的內(nèi)容沒(méi)有被ABI指定;該的程序不如在程序頭表中段所的那樣,這個(gè)成員的缺乏代表沒(méi)有重置入口會(huì)引起非寫(xiě)段的修改。假如該成員存在,一個(gè)或多個(gè)重定位可能假如存在,它的d_ptr成員保存著重定位(該單獨(dú)關(guān)聯(lián) 器在進(jìn)程初始化時(shí)忽略它們。假如該存在,相關(guān)聯(lián)的類 和DT_PLTRELDT_LOPROCthrough和DT_NEEDED元素相關(guān)的次序,可能出現(xiàn)在任何次序中。在表中不出SharedObjectDependencies(共享Object的依賴關(guān)系中的符號(hào)表,然后是頂端T_NEEDED(按順序)的符號(hào)表,再接下來(lái)是第二級(jí)的T_NEEDED,依次類推。共享objet文件必須對(duì)進(jìn)程是可讀的;注意:即使當(dāng)一個(gè)共享object被多次(在依賴列關(guān)系表中),動(dòng)態(tài)連接器 第二,在進(jìn)程環(huán)境中(seeexec(BA_OS)),有一個(gè)變量稱為 GlobalOffsetTable(GOT全局偏移量表一般情況下,位置無(wú)關(guān)的代碼不包含虛擬地址。全局偏移量表在私有數(shù)據(jù)中保存著絕對(duì)地址,所以應(yīng)該使地址可用的,而不是和位置無(wú)關(guān)性和程序代碼段共享能力妥協(xié)。一個(gè)程序 它的OT(全局偏移量表來(lái)使用位置無(wú)關(guān)的地址并且提取變量,所以重 無(wú)關(guān)的參考到位置。初始時(shí),GOT(全局偏移量表)保存著它重定位所需要的信息[看第一部分的表到正確的變量。雖然當(dāng)連接編輯器建造object文件的時(shí)候,絕對(duì)地。因?yàn)榭蓤?zhí)行文件和共享文件有獨(dú)立的GOT(全局偏移量表),一個(gè)符號(hào)地址可能出現(xiàn)在不同的幾個(gè)表中。在交給進(jìn)程映象的代碼控制權(quán)以前,動(dòng)態(tài)連接器處理所有的重定位的OT(全局偏移量表),所以在執(zhí)行時(shí),確認(rèn)絕對(duì)地址是可用的。該表的0是為存動(dòng)態(tài)結(jié)地址保留的參考MC標(biāo)號(hào))象動(dòng)態(tài)連接程序那樣來(lái)找出他們自己的動(dòng)態(tài)結(jié)構(gòu)(還沒(méi)有處理他們的重定向)。這些對(duì)于動(dòng)態(tài)連接器是重要的,因?yàn)樗匾跏蓟约憾荒芤蕾囉谄渌绦騺?lái)重定位他們的內(nèi)存映象。在32位Intel系統(tǒng)結(jié)構(gòu)中,在中的人口1和2(PodueLinkgeTl系統(tǒng)可以為在不同的程序中相同的共享objt選擇不同的內(nèi)存段;它甚至可以為相同的程序不同的進(jìn)程選擇不同的庫(kù)地址。雖然如此,一旦進(jìn)程映象被建立以后,內(nèi)存段不改變地址。只要一個(gè)進(jìn)程存在,它的內(nèi)存段駐留在固定的虛擬地址。 +Figure2-11:GlobalOffsetexternElf32_Addr ProcedureLinkageTable(PLT過(guò)程連接表位置無(wú)關(guān)的函數(shù)調(diào)用到地址。從一個(gè)可執(zhí)行或者共享的object文件到另外的,的傳遞控制到PLT中的。在SYSTEMV體系下,PLT存在共享文本中,但是它使用的地址是在私有的GT中。符號(hào)連接器決定了目標(biāo)的絕對(duì)地址并且修改GOT的內(nèi)存映象。因此,在沒(méi)有危及到位置無(wú)關(guān)、程序文本的共享能力的情況下。動(dòng)態(tài)+Figure2-12:AbsoluteProcedureLinkageTable.PLT0:pushlgot_plus_4 nop;nopnop; pushl$offset pushl$offset +Figure2-13:Position-IndependentProcedureLinkage.PLT0:pushl nop;nopnop; pushl$offset pushl$offset 第二次和第三次的。下面關(guān)于那些變量有的解釋??刂苽鬏?shù)絇LT。從而,要調(diào)用的函數(shù)有責(zé)任在調(diào)用PLT前,設(shè)置T地址到寄存器中。第一個(gè)指令跳到在OT的nm1地址。初始話時(shí),GT保存著緊跟著的ph1指令的地址,而不是真實(shí)的nm1的地址。因此,程序在堆棧中壓入(push)一個(gè)重定位的偏移量。重定位的偏移量是一個(gè)32位,非負(fù)的字節(jié)偏移量(從定位表算起)。指派的重定位將是push1指令在堆棧中放置第二個(gè)GOT(got_plus_4or4(%ebx))的值(got_plus_8or8(%ebx)),它傳輸控制到動(dòng)態(tài)連接器。了。所以,在.PLT1中的jmp指令將轉(zhuǎn)到name1,代替“fallingthrough”第一初始的一個(gè)共享object函數(shù)比后來(lái)的調(diào)用要花的時(shí)間長(zhǎng),因?yàn)閯?dòng)HashTable(哈希表Elf32_Wordobject的哈希表支持符號(hào)表的+Figure2-14:SymbolHashbucket[nbucket-1]chain[nchain-+Figure2-15:Hashingunsignedelf_hash(constunsignedchar{unsigned h=0,while(*name)h=(h<<4)+*name++;if(g=h&0xf h^=g>>24;h&=~g;}return}InitializationandTermination在動(dòng)態(tài)連接妻建立進(jìn)程映象和執(zhí)行重定位以后,每一個(gè)共享objet的機(jī)會(huì)來(lái)執(zhí)行一些初始話代碼。初始化函數(shù)不按特別的順序被調(diào)用,但是所有的共享objet初始化發(fā)生在執(zhí)行程序獲得控制之前。共享objct通過(guò)設(shè)置在動(dòng)態(tài)結(jié)構(gòu)中的DT_IIT和DT_FINI來(lái)指派它們的初始化和終止函數(shù),如上動(dòng)態(tài)setion(ynamicSetion)部分描述。典型的,那些函數(shù)代碼存在.init和.inistion中,第一部分的setion已經(jīng)提到過(guò)。注意:盡管txitB_S)的終止處理一般可可正常完成,但是不保證在死進(jìn)程上被執(zhí)行。特別的,假如_exit被調(diào)用(看xitB_OS))或者假如進(jìn)程死掉,那么進(jìn)程是不執(zhí)行終止處理的。因?yàn)樗盏揭粋€(gè)信號(hào),該信號(hào)可捕獲或忽略。3.C==========================CLibrary表中列出的運(yùn)行函數(shù)。第一個(gè)表中的運(yùn)行函數(shù)是ANSIC標(biāo)準(zhǔn)的。+Figure3-1:libcContents,NameswithoutSynonyms puts freopen qsort labs ldexp fsetpos setbuf strtol fwrite mblen sprintf tolower memcmp isalnum strcmp fprintfislowerprintf再加上,libc+Figure3-2:libcContents,Nameswith lockf** l**cfgetispeedgetopt tempnamcfgetospeedgetpass cfsetispeedgetsubopt mkfifo cfsetospeedgetw mktemp tcflow nl_langinfotcgetpgrptwalk tcsendbreak_xftw isnand** fmtmsg** **=FunctionisatLevel2intheSVIDIssue3andthereforeatLevel2intheABI.包括上面同義(Synonyms)表列出的標(biāo)號(hào),對(duì)于<name>已經(jīng)存在的_<name>intfilbuf(FILEThisfunctionreturnsthenextinputcharacterforf,fillingitsbufferasappropriate.ItreturnsEOFifanerrorflsbuf(intx,FILEThisfunctionflushestheoutputcharactersforfasputc(x,f)hadbeencalledandthenappendsthevalueofxtotheresultingoutputs

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論