欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

一種二進(jìn)制翻譯中庫函數(shù)調(diào)用的處理方法

文檔序號:6626131閱讀:190來源:國知局
專利名稱:一種二進(jìn)制翻譯中庫函數(shù)調(diào)用的處理方法
技術(shù)領(lǐng)域
本發(fā)明涉及計算機(jī)領(lǐng)域的二進(jìn)制翻譯技術(shù),尤其涉及動靜結(jié)合方式下二進(jìn)制翻譯中對庫函數(shù)調(diào)用的處理方法。
背景技術(shù)
二進(jìn)制翻譯技術(shù)是目前解決軟件移植問題的一個研究熱點,能將現(xiàn)有的軟件移植到新開發(fā)的處理器上執(zhí)行,使新處理器擺脫向前兼容的約束,對促進(jìn)處理器體系結(jié)構(gòu)的發(fā)展和國產(chǎn)微處理器的推廣具有重要意義。
在介紹本發(fā)明之前,首先簡要講解本發(fā)明所涉及的一些背景技術(shù),主要包括動靜結(jié)合二進(jìn)制翻譯系統(tǒng)的特點;被執(zhí)行程序與系統(tǒng)之間的翻譯界面定在系統(tǒng)調(diào)用一級的原因;過程鏈接表(Procedure Linkage Table以下簡稱PLT)和全局偏移表(Global Offset Table以下簡稱GOT)的工作原理;以及X86和MIPS在進(jìn)行函數(shù)調(diào)用時參數(shù)和返回值的傳遞方法。
動靜結(jié)合二進(jìn)制翻譯系統(tǒng)綜合了動態(tài)和靜態(tài)二進(jìn)制翻譯系統(tǒng)的優(yōu)點。優(yōu)化以靜態(tài)為主,利用傳統(tǒng)的靜態(tài)編譯優(yōu)化方法對翻譯出來的本地碼進(jìn)行深度優(yōu)化,避免動態(tài)優(yōu)化的時間消耗,我們稱靜態(tài)模塊翻譯出來的目標(biāo)機(jī)本地代碼為靜態(tài)本地碼。動態(tài)模塊把靜態(tài)本地碼裝入內(nèi)存執(zhí)行,并且翻譯靜態(tài)模塊不能翻譯的源二進(jìn)制代碼,把間接跳轉(zhuǎn)和間接調(diào)用的目標(biāo)傳給靜態(tài)模塊幫助其進(jìn)一步擴(kuò)大翻譯優(yōu)化的范圍。經(jīng)過幾遍動靜結(jié)合的迭代翻譯之后,能夠得到質(zhì)量較好的本地碼。
被執(zhí)行程序與系統(tǒng)之間的翻譯界面定在系統(tǒng)調(diào)用一級而不是定在主文件和共享庫之間的原因主要有兩點(1)可能造成全局變量在不同的文件中有多個副本,不便于管理;(2)對于結(jié)構(gòu)變量,由于源與目標(biāo)機(jī)器對齊方式不同,占用空間可能不同,可能造成目標(biāo)機(jī)本地的庫函數(shù)對X86的結(jié)構(gòu)變量的引用錯誤。
GOT(全局偏移表)與PLT(過程鏈接表)是ELF(可執(zhí)行和可鏈接格式)文件提供的處理庫函數(shù)動態(tài)鏈接的標(biāo)準(zhǔn)結(jié)構(gòu)。GOT的作用是記錄一個文件中調(diào)用的庫函數(shù)的地址,這個地址在發(fā)生庫函數(shù)調(diào)用時由動態(tài)鏈接器填寫。PLT包括兩部分,所有庫函數(shù)公用的PLT表項(PLT0),以及每個庫函數(shù)自己的PLT表項(PLTi,i=1,2,…)。調(diào)用庫函數(shù)時,控制轉(zhuǎn)入庫函數(shù)對應(yīng)的PLTi中,然后間接跳轉(zhuǎn)到PLT0中,PLT0調(diào)用動態(tài)鏈接器的fixup函數(shù),再由fixup執(zhí)行要調(diào)用的庫函數(shù)并且填寫GOT。以后再調(diào)用這個庫函數(shù)時,就依照GOT中的地址把控制轉(zhuǎn)移到庫函數(shù)。PLT的偽代碼如圖1所示。
X86/Linux系統(tǒng)的參數(shù)傳遞是采用堆棧形式進(jìn)行的。主調(diào)函數(shù)(Caller)把參數(shù)存入堆棧中,被調(diào)函數(shù)(Callee)從堆棧中取出參數(shù),參與相應(yīng)的操作。返回值的傳遞方式分情況處理,對于單一數(shù)據(jù),通過eax寄存器或者浮點寄存器ST(0)傳遞;若是結(jié)構(gòu)類型,傳參時將返回值地址作為參數(shù)壓棧,Callee將返回值存入?yún)?shù)指定的地址完成傳遞工作。MIPS/Linux系統(tǒng)的傳參和傳返回值比較復(fù)雜,采用堆棧和寄存器結(jié)合的形式。傳參方式對整數(shù)和浮點數(shù)區(qū)分處理,提供了4個整型寄存器($4-$7)和4個浮點寄存器($f12-$f15)用于傳參,當(dāng)寄存器不夠用時借助堆棧。傳遞返回值的方式類似于傳參方式,有專門的返回寄存器,當(dāng)返回值超過返回寄存器的存儲限制,則借助堆棧傳送。
通過對背景知識的分析我們知道,由于翻譯界面定在系統(tǒng)調(diào)用一級,源機(jī)器的庫函數(shù)代碼也是被翻譯的對象。由于采用動靜結(jié)合的二進(jìn)制翻譯方式,可以事先對源機(jī)器共享庫的庫函數(shù)代碼進(jìn)行靜態(tài)翻譯,把靜態(tài)本地碼存在磁盤上,動態(tài)模塊把需要的共享庫的本地碼裝入內(nèi)存。
目前二進(jìn)制翻譯中對庫函數(shù)調(diào)用的處理方法主要有兩種一種方法是對本地庫函數(shù)的簡單包裝,這種方法主要應(yīng)用在翻譯界面定在主文件和共享庫之間的情況,具體就是在目標(biāo)機(jī)上用內(nèi)存模擬X86的堆棧及其參數(shù)壓棧和取返回值的行為,通過包裝的方法與本地的庫函數(shù)之間傳遞參數(shù)和返回值,但是存在前面所述的多個副本以及對齊方式的問題;另一種方法是在目標(biāo)機(jī)上模擬X86的動態(tài)鏈接機(jī)制以及參數(shù)和返回值傳遞約定,這種方法主要應(yīng)用在翻譯界面定在系統(tǒng)調(diào)用一級的情況。具體就是在目標(biāo)機(jī)上用內(nèi)存模擬X86的堆棧及其參數(shù)壓棧和取返回值的行為,按照X86處理動態(tài)鏈接的執(zhí)行流程,把PLT、fixup函數(shù)、庫函數(shù)的源二進(jìn)制代碼都進(jìn)行翻譯執(zhí)行。由于翻譯會造成代碼膨脹,因此會造成執(zhí)行效率的下降。

發(fā)明內(nèi)容
本發(fā)明的目的是針對現(xiàn)有技術(shù)存在的缺陷,消除由于全局變量多個副本以及結(jié)構(gòu)變量對齊方式差異帶來的問題,提高二進(jìn)制翻譯中對庫函數(shù)調(diào)用處理的效率。
為了達(dá)到上述目的,本發(fā)明提供了一種二進(jìn)制翻譯中庫函數(shù)調(diào)用的處理方法,包括以下步驟a.建立庫函數(shù)分類查詢表;b.利用動靜結(jié)合二進(jìn)制翻譯系統(tǒng)中的靜態(tài)模塊對主文件和它涉及的共享庫中的庫函數(shù)進(jìn)行翻譯;c.在控制轉(zhuǎn)移到動態(tài)翻譯之前,把靜態(tài)翻譯好的本地碼裝入內(nèi)存,這部分本地碼包括被執(zhí)行主文件和共享庫中的庫函數(shù)兩部分;d.在目標(biāo)機(jī)中用內(nèi)存模擬X86的寄存器和堆棧;具體定義如圖2所示;e.依次對X86二進(jìn)制程序中的每個基本塊進(jìn)行處理,取X86二進(jìn)制程序中的第一個基本塊;f.判別基本塊的結(jié)束指令的指令類型是否為CALL指令,如果是,則進(jìn)行步驟g,如果否,則進(jìn)行步驟h;g.調(diào)用CALL指令處理模塊處理CALL指令;h.判斷是否所有的基本塊都處理了?如果是,則結(jié)束;如果否,則進(jìn)行步驟i;i.取下一個基本塊,然后進(jìn)行步驟f。
在上述方案中,可包裝庫函數(shù)是一種庫函數(shù),沒有全局變量多個副本和結(jié)構(gòu)變量對齊方式差異,可以調(diào)用本地的庫函數(shù)。
在上述方案中,PLT短路庫函數(shù)是一種庫函數(shù),其本地碼在靜態(tài)模塊已經(jīng)翻譯過,動態(tài)模塊直接跳入靜態(tài)本地碼中,不需要翻譯執(zhí)行PLT和fixup函數(shù)。
在上述方案中,包含以下步驟f1)判斷CALL的目標(biāo)是否為庫函數(shù)?,如果是,則進(jìn)行步驟f2,如果否,則進(jìn)行步驟f8;f2)查詢庫函數(shù)分類表;f3)判斷是否是可包裝庫函數(shù),如果是,進(jìn)行步驟f4,如果否,進(jìn)行步驟f5;f4)進(jìn)行可包裝庫函數(shù)處理;f5)判斷是否是PLT短路庫函數(shù)?,如果是,進(jìn)行步驟f6,如果否,進(jìn)行步驟f7f6)進(jìn)行PLT短路庫函數(shù)處理;f7)在目標(biāo)機(jī)上模擬X86的參數(shù)和返回值傳遞約定,按照X86處理動態(tài)鏈接的執(zhí)行流程,把PLT、fixup函數(shù)、庫函數(shù)的源二進(jìn)制代碼都進(jìn)行翻譯執(zhí)行;f8)模擬X86傳參和返回值約定的方法對這種主文件內(nèi)部的普通函數(shù)調(diào)用進(jìn)行處理。
在上述方案中,在步驟f4中,包含以下子步驟f41)根據(jù)相應(yīng)庫函數(shù)的行參說明,在本基本塊內(nèi)往前找壓參數(shù)的語句;f42)判斷是否查找成功?如果是,則進(jìn)行步驟f43,如果否,則進(jìn)行步驟f44;f43)刪除本基本塊內(nèi)找到的那些壓參數(shù)指令翻譯后對應(yīng)的本地碼,并形成如下本地代碼將這些參數(shù)按照目標(biāo)機(jī)傳參約定放入到相應(yīng)的寄存器和堆棧中;X86模擬寄存器ESP=X86模擬寄存器ESP-所有參數(shù)總大??;調(diào)用本地庫函數(shù);按照目標(biāo)機(jī)傳返回值約定取出返回值,然后按照X86約定放入到X86模擬寄存器或內(nèi)存中;f44)在目標(biāo)機(jī)上模擬X86的參數(shù)和返回值傳遞約定,調(diào)用包裝的本地庫函數(shù)完成庫函數(shù)調(diào)用的處理。
在上述方案中,在步驟f6中,包含以下子步驟f61)在靜態(tài)部分提供的本地碼和動態(tài)部分翻譯的本地碼中查找當(dāng)前要處理的庫函數(shù)的本地碼;f62)判斷是否查找成功?,如果是,進(jìn)行步驟f63,如果否,進(jìn)行步驟f64;f63)把調(diào)用庫函數(shù)的CALL指令翻譯成如下的本地代碼跳轉(zhuǎn)到庫函數(shù)本地碼在內(nèi)存中存放的地址,并且把返回地址放入約定好的寄存器中;f64)生成跳轉(zhuǎn)目標(biāo)是空的轉(zhuǎn)移指令,并做好標(biāo)記,同時把返回地址放入約定好的寄存器中,當(dāng)把庫函數(shù)的本地碼裝入內(nèi)存或者翻譯之后,再把本地碼的存放地址填入跳轉(zhuǎn)指令中。
因此,本發(fā)明盡可能地對源X86二進(jìn)制程序中的庫函數(shù)調(diào)用進(jìn)行識別和提升;對于可包裝庫函數(shù),用目標(biāo)機(jī)本地的約定進(jìn)行傳參和返回值處理,這樣省去了對X86參數(shù)壓棧和從堆棧中取返回值的模擬,避免了頻繁的內(nèi)存操作,使用本地的庫函數(shù),也不會因為翻譯PLT、fixup函數(shù)、庫函數(shù)的源二進(jìn)制代碼造成代碼膨脹導(dǎo)致的性能損失,提高了程序執(zhí)行的效率;對于PLT短路庫函數(shù),雖然繼續(xù)維護(hù)X86模擬堆棧,但是控制流不進(jìn)入PLT和動態(tài)鏈接器的fixup函數(shù),即不翻譯PLT和動態(tài)鏈接器的fixup函數(shù)的源二進(jìn)制代碼,避免了因為翻譯PLT、fixup函數(shù)造成代碼膨脹導(dǎo)致的性能損失,控制流直接進(jìn)入庫函數(shù)的本地碼,也能夠較好地提高程序執(zhí)行的效率。
綜上所述,本發(fā)明中對可包裝庫函數(shù)的處理帶來的性能上的提高強(qiáng)于對PLT短路庫函數(shù)的處理,但是對于庫函數(shù)不具有普適性,不是所有的庫函數(shù)都是可包裝庫函數(shù);PLT短路庫函數(shù)雖然不如可包裝庫函數(shù)對性能提高的貢獻(xiàn)大,但是具有較強(qiáng)的普適性。但總的來說,兩種情況的處理都具有較好的效率。


圖1是現(xiàn)有技術(shù)中PLT的偽代碼(摘自ELF手冊)示意圖;圖2是現(xiàn)有技術(shù)中目標(biāo)機(jī)中用內(nèi)存模擬X86的寄存器和堆棧示意圖;圖3是本發(fā)明中一種二進(jìn)制翻譯中庫函數(shù)調(diào)用的處理方法的流程圖;圖4是本發(fā)明中對CALL指令的處理方法流程圖;圖5是本發(fā)明中對可包裝庫函數(shù)的處理方法流程圖;圖6是本發(fā)明中對PLT短路庫函數(shù)的處理方法流程圖。
具體實施例方式
在本發(fā)明中,定義兩個術(shù)語可包裝庫函數(shù)和PLT短路庫函數(shù)。如果某個庫函數(shù)沒有全局變量多個副本和結(jié)構(gòu)變量對齊方式差異這兩種問題,那么可以調(diào)用本地的庫函數(shù),這樣就不會因為翻譯PLT、fixup函數(shù)、庫函數(shù)的源二進(jìn)制代碼造成代碼膨脹導(dǎo)致的性能損失,本發(fā)明中稱這類庫函數(shù)為可包裝庫函數(shù);有些庫函數(shù)的本地碼在靜態(tài)模塊已經(jīng)翻譯過,動態(tài)模塊可以直接跳入靜態(tài)本地碼中,不需要翻譯執(zhí)行PLT和fixup函數(shù),相當(dāng)于把動態(tài)鏈接在某種程度上還原回靜態(tài)鏈接,也避免了因為翻譯PLT、fixup函數(shù)造成的性能損失,本發(fā)明中稱這類庫函數(shù)為PLT短路庫函數(shù)。
本發(fā)明提出了一種二進(jìn)制翻譯中庫函數(shù)調(diào)用的處理方法,對于可包裝庫函數(shù)和PLT短路庫函數(shù)分別處理,同時在處理之前建立庫函數(shù)分類查詢表來區(qū)分可包裝庫函數(shù)和PLT短路庫函數(shù),以便對每個庫函數(shù)分類處理,若某個庫函數(shù)不在分類查詢表中,則采取在目標(biāo)機(jī)上模擬X86的動態(tài)鏈接機(jī)制以及參數(shù)和返回值傳遞約定的方法處理。
本發(fā)明建立在如下三個基本的原則上一是盡可能地識別和提升原X86二進(jìn)制程序的庫函數(shù)調(diào)用;二是對可包裝庫函數(shù)盡可能地避免在處理庫函數(shù)調(diào)用時模擬X86的堆棧,而是用目標(biāo)機(jī)本地函數(shù)調(diào)用約定來處理庫函數(shù)調(diào)用,從而提高翻譯出來的本地碼的執(zhí)行效率;三是對于PLT短路庫函數(shù)盡可能地利用已經(jīng)翻譯好的本地碼,尤其是靜態(tài)模塊翻譯的質(zhì)量較高的本地碼,盡可能地避免翻譯PLT和動態(tài)鏈接器的X86代碼,從而提高翻譯出來的本地碼的執(zhí)行效率。
下面參照附圖詳細(xì)說明本發(fā)明的技術(shù)方案。
如圖3所示,一種二進(jìn)制翻譯中庫函數(shù)調(diào)用的處理方法包括以下步驟步驟1,首先,建立庫函數(shù)分類查詢表;動靜結(jié)合二進(jìn)制翻譯系統(tǒng)中的靜態(tài)模塊和動態(tài)模塊都要參照這個表;步驟2,利用動靜結(jié)合二進(jìn)制翻譯系統(tǒng)中的靜態(tài)模塊對主文件和它涉及的共享庫中的庫函數(shù)進(jìn)行翻譯;步驟3,在控制轉(zhuǎn)移到動態(tài)翻譯之前,把靜態(tài)翻譯好的本地碼裝入內(nèi)存,這部分本地碼包括被執(zhí)行主文件和共享庫中的庫函數(shù)兩部分;步驟4,在目標(biāo)機(jī)中用內(nèi)存模擬X86的寄存器和堆棧;具體定義如圖2所示;步驟5,依次對X86二進(jìn)制程序中的每個基本塊進(jìn)行處理,取X86二進(jìn)制程序中的第一個基本塊;步驟6,判別基本塊的結(jié)束指令的指令類型是否為CALL指令,如果是,則進(jìn)行步驟7,如果否,則進(jìn)行步驟8;步驟7,調(diào)用CALL指令處理模塊處理CALL指令;
步驟8,判斷是否所有的基本塊都處理了?如果是,則結(jié)束;如果否,則進(jìn)行步驟9;步驟9,取下一個基本塊,然后進(jìn)行步驟6。
如圖4所示,在步驟6中,包含以下步驟步驟61,判斷CALL的目標(biāo)是否為庫函數(shù)?,如果是,則進(jìn)行步驟62,如果否,則進(jìn)行步驟68;步驟62,查詢庫函數(shù)分類表;步驟63,判斷是否是可包裝庫函數(shù),如果是,進(jìn)行步驟64,如果否,進(jìn)行步驟65;步驟64,進(jìn)行可包裝庫函數(shù)處理;步驟65,判斷是否是PLT短路庫函數(shù)?,如果是,進(jìn)行步驟66,如果否,進(jìn)行步驟67;步驟66,進(jìn)行PLT短路庫函數(shù)處理;步驟67,在目標(biāo)機(jī)上模擬X86的參數(shù)和返回值傳遞約定,按照X86處理動態(tài)鏈接的執(zhí)行流程,把PLT、fixup函數(shù)、庫函數(shù)的源二進(jìn)制代碼都進(jìn)行翻譯執(zhí)行;步驟68,模擬X86傳參和返回值約定的方法對這種主文件內(nèi)部的普通函數(shù)調(diào)用進(jìn)行處理。
如圖5所示,在步驟64中,包含以下子步驟步驟400,根據(jù)相應(yīng)庫函數(shù)的行參說明,在本基本塊內(nèi)往前找壓參數(shù)的語句;步驟410,判斷是否查找成功?如果是,則進(jìn)行步驟420,如果否,則進(jìn)行步驟430;步驟420,刪除本基本塊內(nèi)找到的那些壓參數(shù)指令翻譯后對應(yīng)的本地碼,并形成如下本地代碼將這些參數(shù)按照目標(biāo)機(jī)傳參約定放入到相應(yīng)的寄存器和堆棧中;X86模擬寄存器ESP=X86模擬寄存器ESP-所有參數(shù)總大小;調(diào)用本地庫函數(shù);按照目標(biāo)機(jī)傳返回值約定取出返回值,然后按照X86約定放入到X86模擬寄存器或內(nèi)存中。
步驟430,在目標(biāo)機(jī)上模擬X86的參數(shù)和返回值傳遞約定,調(diào)用包裝的本地庫函數(shù)完成庫函數(shù)調(diào)用的處理。
如圖6所示,在步驟66中,包含以下子步驟步驟600,在靜態(tài)部分提供的本地碼和動態(tài)部分翻譯的本地碼中查找當(dāng)前要處理的庫函數(shù)的本地碼;步驟610,判斷是否查找成功?,如果是,進(jìn)行步驟620,如果否,進(jìn)行步驟630;步驟620,把調(diào)用庫函數(shù)的CALL指令翻譯成如下的本地代碼跳轉(zhuǎn)到庫函數(shù)本地碼在內(nèi)存中存放的地址,并且把返回地址放入約定好的寄存器中。
步驟630,由于目標(biāo)庫函數(shù)的本地碼可能沒有被動態(tài)模塊裝入或者沒有被翻譯,因此采用回填的方法處理庫函數(shù)的調(diào)用;具體就是生成跳轉(zhuǎn)目標(biāo)是空的轉(zhuǎn)移指令,并做好標(biāo)記,同時把返回地址放入約定好的寄存器中,當(dāng)把庫函數(shù)的本地碼裝入內(nèi)存或者翻譯之后,再把本地碼的存放地址填入跳轉(zhuǎn)指令中。
本發(fā)明所提供的動靜結(jié)合二進(jìn)制翻譯中的庫函數(shù)調(diào)用處理方法具有如下特點在翻譯前對庫函數(shù)進(jìn)行分類,分為可包裝庫函數(shù)和PLT短路庫函數(shù);靜態(tài)模塊會對庫函數(shù)進(jìn)行一定程度的翻譯并把翻譯結(jié)果傳給動態(tài)模塊;對源X86二進(jìn)制程序中的庫函數(shù)調(diào)用進(jìn)行識別和提升;對于可包裝庫函數(shù),用目標(biāo)機(jī)本地的約定進(jìn)行傳參和返回值處理,這樣能省去將參數(shù)壓入X86模擬堆棧,然后又從堆棧中取出放入到目標(biāo)機(jī)傳參寄存器或堆棧中過程中頻繁對內(nèi)存的操作,提高了程序執(zhí)行的效率;對于PLT短路庫函數(shù),雖然繼續(xù)維護(hù)X86模擬堆棧,但是控制流不進(jìn)入PLT和動態(tài)鏈接器的fixup函數(shù),即不翻譯PLT和動態(tài)鏈接器的fixup函數(shù)的源二進(jìn)制代碼,直接進(jìn)入庫函數(shù)的本地碼,也能夠提高程序執(zhí)行的效率。
最后應(yīng)說明的是以上實施例僅用以說明而非限制本發(fā)明的技術(shù)方案,盡管參照上述實施例對本發(fā)明進(jìn)行了詳細(xì)說明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解依然可以對本發(fā)明進(jìn)行修改或者等同替換,而不脫離本發(fā)明的精神和范圍的任何修改或局部替換,其均應(yīng)涵蓋在本發(fā)明的權(quán)利要求范圍當(dāng)中。
權(quán)利要求
1.一種二進(jìn)制翻譯中庫函數(shù)調(diào)用的處理方法,包括以下步驟a.建立庫函數(shù)分類查詢表,在表中,對可包裝庫函數(shù)和PLT短路庫函數(shù)做分類;b.利用動靜結(jié)合二進(jìn)制翻譯系統(tǒng)中的靜態(tài)模塊對主文件和它涉及的共享庫中的庫函數(shù)進(jìn)行翻譯;c.在控制轉(zhuǎn)移到動態(tài)翻譯之前,把靜態(tài)翻譯好的本地碼裝入內(nèi)存,這部分本地碼包括被執(zhí)行主文件和共享庫中的庫函數(shù)兩部分;d.在目標(biāo)機(jī)中用內(nèi)存模擬X86的寄存器和堆棧;e.依次對X86二進(jìn)制程序中的每個基本塊進(jìn)行處理,取X86二進(jìn)制程序中的第一個基本塊;f.判別基本塊的結(jié)束指令的指令類型是否為CALL指令,如果是,則進(jìn)行步驟g,如果否,則進(jìn)行步驟h;g.調(diào)用CALL指令處理模塊處理CALL指令;h.判斷是否所有的基本塊都處理了,如果是,則結(jié)束;如果否,則進(jìn)行步驟i;i.取下一個基本塊,然后進(jìn)行步驟f。
2.如權(quán)利要求1所述的一種二進(jìn)制翻譯中庫函數(shù)調(diào)用的處理方法,其特征在于,在步驟f中,包含以下步驟f1)判斷CALL的目標(biāo)是否為庫函數(shù),如果是,則進(jìn)行步驟f2,如果否,則進(jìn)行步驟f8;f2)查詢庫函數(shù)分類表;f3)判斷是否是可包裝庫函數(shù),如果是,進(jìn)行步驟f4,如果否,進(jìn)行步驟f5;f4)進(jìn)行可包裝庫函數(shù)處理;f5)判斷是否是PLT短路庫函數(shù),如果是,進(jìn)行步驟f6,如果否,進(jìn)行步驟f7;f6)進(jìn)行PLT短路庫函數(shù)處理;f7)在目標(biāo)機(jī)上模擬X86的參數(shù)和返回值傳遞約定,按照X86處理動態(tài)鏈接的執(zhí)行流程,把PLT、fixup函數(shù)、庫函數(shù)的源二進(jìn)制代碼都進(jìn)行翻譯執(zhí)行;執(zhí)行流程,把PLT、fixup函數(shù)、庫函數(shù)的源二進(jìn)制代碼都進(jìn)行翻譯執(zhí)行;f8)模擬X86傳參和返回值約定的方法對這種主文件內(nèi)部的普通函數(shù)調(diào)用進(jìn)行處理。
3.如權(quán)利要求2所述的一種二進(jìn)制翻譯中庫函數(shù)調(diào)用的處理方法,其特征在于,在步驟f4中,包含以下子步驟f41)根據(jù)相應(yīng)庫函數(shù)的行參說明,在本基本塊內(nèi)往前找壓參數(shù)的語句;f42)判斷是否查找成功,如果是,則進(jìn)行步驟f43,如果否,則進(jìn)行步驟f44;f43)刪除本基本塊內(nèi)找到的那些壓參數(shù)指令翻譯后對應(yīng)的本地碼,并形成如下本地代碼將這些參數(shù)按照目標(biāo)機(jī)傳參約定放入到相應(yīng)的寄存器和堆棧中;X86模擬寄存器ESP=X86模擬寄存器ESP-所有參數(shù)總大小;調(diào)用本地庫函數(shù);按照目標(biāo)機(jī)傳返回值約定取出返回值,然后按照X86約定放入到X86模擬寄存器或內(nèi)存中;f44)在目標(biāo)機(jī)上模擬X86的參數(shù)和返回值傳遞約定,調(diào)用包裝的本地庫函數(shù)完成庫函數(shù)調(diào)用的處理。
4.如權(quán)利要求2所述的一種二進(jìn)制翻譯中庫函數(shù)調(diào)用的處理方法,其特征在于,在步驟f6中,包含以下子步驟f61)在靜態(tài)部分提供的本地碼和動態(tài)部分翻譯的本地碼中查找當(dāng)前要處理的庫函數(shù)的本地碼;f62)判斷是否查找成功,如果是,進(jìn)行步驟f63,如果否,進(jìn)行步驟f64;f63)把調(diào)用庫函數(shù)的CALL指令翻譯成如下的本地代碼跳轉(zhuǎn)到庫函數(shù)本地碼在內(nèi)存中存放的地址,并且把返回地址放入約定好的寄存器中;f64)生成跳轉(zhuǎn)目標(biāo)是空的轉(zhuǎn)移指令,并做好標(biāo)記,同時把返回地址放入約定好的寄存器中,當(dāng)把庫函數(shù)的本地碼裝入內(nèi)存或者翻譯之后,再把本地碼的存放地址填入跳轉(zhuǎn)指令中。
5.如權(quán)利要求1或2所述的一種二進(jìn)制翻譯中庫函數(shù)調(diào)用的處理方法,其特征在于,所述的可包裝庫函數(shù)是一種庫函數(shù),沒有全局變量多個副本和結(jié)構(gòu)變量對齊方式差異,可以調(diào)用本地的庫函數(shù)。
6.如權(quán)利要求1或2所述的一種二進(jìn)制翻譯中庫函數(shù)調(diào)用的處理方法,其特征在于,所述的PLT短路庫函數(shù)是一種庫函數(shù),其本地碼在靜態(tài)模塊已經(jīng)翻譯過,動態(tài)模塊直接跳入靜態(tài)本地碼中,不需要翻譯執(zhí)行PLT和fixup函數(shù)。
全文摘要
本發(fā)明公開了一種二進(jìn)制翻譯中庫函數(shù)調(diào)用的處理方法,盡可能地對源X86二進(jìn)制程序中的庫函數(shù)調(diào)用進(jìn)行識別和提升;對于可包裝庫函數(shù),用目標(biāo)機(jī)本地的約定進(jìn)行傳參和返回值處理,這樣省去了對X86參數(shù)壓棧和從堆棧中取返回值的模擬,避免了頻繁的內(nèi)存操作,使用本地的庫函數(shù),也不會因為翻譯PLT、fixup函數(shù)、庫函數(shù)的源二進(jìn)制代碼造成代碼膨脹導(dǎo)致的性能損失,提高了程序執(zhí)行的效率;對于PLT短路庫函數(shù),雖然繼續(xù)維護(hù)X86模擬堆棧,但是控制流不進(jìn)入PLT和動態(tài)鏈接器的fixup函數(shù),即不翻譯PLT和動態(tài)鏈接器的fixup函數(shù)的源二進(jìn)制代碼,避免了因為翻譯PLT、fixup函數(shù)造成代碼膨脹導(dǎo)致的性能損失,控制流直接進(jìn)入庫函數(shù)的本地碼,也能夠較好地提高程序執(zhí)行的效率。
文檔編號G06F9/45GK1892602SQ200510080339
公開日2007年1月10日 申請日期2005年7月1日 優(yōu)先權(quán)日2005年7月1日
發(fā)明者楊浩, 唐鋒, 謝海斌, 武成崗, 張兆慶, 馮曉兵, 崔慧敏, 陳龍 申請人:中國科學(xué)院計算技術(shù)研究所
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
资阳市| 乐山市| 横峰县| 昂仁县| 金湖县| 侯马市| 玉溪市| 农安县| 乐都县| 简阳市| 且末县| 辽宁省| 炉霍县| 恩平市| 浦城县| 乳山市| 富锦市| 灵丘县| 玉溪市| 曲麻莱县| 波密县| 安平县| 灵山县| 博湖县| 泗水县| 青阳县| 陆河县| 时尚| 桂林市| 准格尔旗| 朝阳市| 封开县| 林周县| 民勤县| 崇义县| 望都县| 七台河市| 湖州市| 株洲县| 黔南| 夏邑县|