專利名稱:熱補(bǔ)丁方法及裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及通信領(lǐng)域,具體而言,涉及一種熱補(bǔ)丁方法及裝置。
背景技術(shù):
補(bǔ)丁技術(shù)的基本原理是將現(xiàn)有系統(tǒng)中正在運(yùn)行的函數(shù)替換成補(bǔ)丁函數(shù),從而改變了原函數(shù)的功能,以達(dá)到修改系統(tǒng)功能,或糾正現(xiàn)有系統(tǒng)故障的目的。目前公開的補(bǔ)丁技術(shù)有多種方案,比較典型的技術(shù)方案有以下兩種補(bǔ)丁方案II.將補(bǔ)丁函數(shù)funcA重新編譯,生成可重定位的目標(biāo)文件fileB。2.在目標(biāo)機(jī)中解析目標(biāo)文件fileB,提取出代碼段、data段、bss段到內(nèi)存中。3.分析目標(biāo)機(jī)中的內(nèi)存符號表,解析出被補(bǔ)丁函數(shù)funcC的地址。4.修改被補(bǔ)丁函數(shù)funcC的首指令為跳轉(zhuǎn)指令,跳轉(zhuǎn)到補(bǔ)丁函數(shù)funcA。這樣,假設(shè)當(dāng)被補(bǔ)丁函數(shù)funcC被調(diào)用時,由于funcC的起始指令是一個跳轉(zhuǎn)指令,于是直接跳轉(zhuǎn)到補(bǔ)丁函數(shù)funcA中去執(zhí)行,返回時直接返回到被補(bǔ)丁函數(shù)funcC的下一條指令處,從而達(dá)到補(bǔ)丁函數(shù)funcA取代被補(bǔ)丁函數(shù)funcC的目的。補(bǔ)丁方案2I.將需要補(bǔ)丁函數(shù)funcA重新編譯,生成可重定位的目標(biāo)文件fileB。2.解析目標(biāo)文件fileB,解析出補(bǔ)丁函數(shù)funcA的位置、尺寸等信息以及funcB引用外部符號的信息,生成補(bǔ)丁信息infoE。3.將補(bǔ)丁信息infoE和可重定位的目標(biāo)文件fiIeB合在一起生成一個新的補(bǔ)丁文件 fileFo4.在目標(biāo)機(jī)中解析補(bǔ)丁文件fileF,提取目標(biāo)文件fileB的text段、data段、bss 段到內(nèi)存中。5.在目標(biāo)機(jī)種解析補(bǔ)丁文件fileF,提取補(bǔ)丁信息infoE,根據(jù)補(bǔ)丁信息infoE所記錄的被補(bǔ)丁函數(shù)funcD名稱在內(nèi)存符號表中進(jìn)行檢索,找到被補(bǔ)丁函數(shù)funcD的地址。6.修改被補(bǔ)丁函數(shù)funcD首指令為跳轉(zhuǎn)指令,跳轉(zhuǎn)到補(bǔ)丁函數(shù)funcA。補(bǔ)丁函數(shù)的具體執(zhí)行過程和補(bǔ)丁方案I完全一樣,不再贅述。目前上述兩個方案均存在如下缺陷,即無法支持需要進(jìn)行長跳轉(zhuǎn)的函數(shù),至少需要兩條指令實(shí)現(xiàn)長跳轉(zhuǎn),可能導(dǎo)致程序中斷,甚至系統(tǒng)故障。
發(fā)明內(nèi)容
本發(fā)明提供了一種熱補(bǔ)丁方法及裝置,以至少解決相關(guān)技術(shù)中,補(bǔ)丁技術(shù)實(shí)現(xiàn)從被補(bǔ)丁函數(shù)重定位到補(bǔ)丁函數(shù)的長跳轉(zhuǎn)至少需要兩條指令,可能導(dǎo)致程序中斷,甚至系統(tǒng)故障的問題。根據(jù)本發(fā)明的一個方面,提供了一種熱補(bǔ)丁方法,包括確定調(diào)用指令與補(bǔ)丁函數(shù)之間的距離超過短跳轉(zhuǎn)指令能夠跳轉(zhuǎn)的范圍;將調(diào)用指令替換為帶索引值的非法指令,其
4中索引值對應(yīng)于補(bǔ)丁函數(shù)。優(yōu)選地,將調(diào)用指令替換為帶索引值的非法指令包括確定用于執(zhí)行替換操作的指令屬于長跳轉(zhuǎn)指令;獲取用于執(zhí)行替換操作的指令中的用于控制PC指針轉(zhuǎn)移過程的指令;將用于控制PC指針轉(zhuǎn)移過程的指令替換為帶索引值的非法指令。優(yōu)選地,獲取用于執(zhí)行替換操作的指令中的用于控制PC指針轉(zhuǎn)移過程的指令包括在用于執(zhí)行替換操作的指令中搜索長跳轉(zhuǎn)指令,得到用于控制PC指針轉(zhuǎn)移過程的指令。優(yōu)選地,在將調(diào)用指令替換為帶索引值的非法指令之前,上述方法還包括確定被補(bǔ)丁函數(shù)是靜態(tài)函數(shù);確定被補(bǔ)丁函數(shù)所屬的文件。優(yōu)選地,確定被補(bǔ)丁函數(shù)所屬的文件包括在映像文件的符號表中查找被補(bǔ)丁函數(shù)所屬的文件的符號;遍歷符號表,查找到與被補(bǔ)丁函數(shù)名稱相同的符號;記錄查找到的符號在符號表中的下標(biāo)。優(yōu)選地,在將調(diào)用指令替換為帶索引值的非法指令之后,上述方法還包括目標(biāo)機(jī)在執(zhí)行與非法指令對應(yīng)的異常處理函數(shù)的過程中,根據(jù)索引值獲取補(bǔ)丁函數(shù)的地址;目標(biāo)機(jī)將異常處理函數(shù)的返回地址修改為補(bǔ)丁函數(shù)地址。根據(jù)本發(fā)明的另一方面,提供了一種熱補(bǔ)丁裝置,包括第一確定模塊,用于確定調(diào)用指令與補(bǔ)丁函數(shù)之間的距離超過短跳轉(zhuǎn)指令能夠跳轉(zhuǎn)的范圍;替換模塊,用于將調(diào)用指令替換為帶索引值的非法指令,其中索引值對應(yīng)于補(bǔ)丁函數(shù)。優(yōu)選地,替換模塊包括確定子模塊,用于確定用于執(zhí)行替換操作的指令屬于長跳轉(zhuǎn)指令;獲取子模塊,用于獲取用于執(zhí)行替換操作的指令中的用于控制PC指針轉(zhuǎn)移過程的指令;替換子模塊,用于將用于控制PC指針轉(zhuǎn)移過程的指令替換為帶索引值的非法指令。優(yōu)選地,獲取子模塊包括搜索單元,用于在用于執(zhí)行替換操作的指令中搜索長跳轉(zhuǎn)指令,得到用于控制PC指針轉(zhuǎn)移過程的指令。優(yōu)選地,上述裝置還包括第二確定模塊,用于確定被補(bǔ)丁函數(shù)是靜態(tài)函數(shù);第三確定模塊,用于確定被補(bǔ)丁函數(shù)所屬的文件。本發(fā)明利用指令異常機(jī)制,將需要執(zhí)行的長跳轉(zhuǎn)指令替換成帶索引值的非法指令,并將該索引值對應(yīng)于補(bǔ)丁函數(shù),這樣,當(dāng)目標(biāo)機(jī)執(zhí)行與該非法指令對應(yīng)的異常處理函數(shù)并返回時可以直接執(zhí)行補(bǔ)丁函數(shù),從而用單條指令實(shí)現(xiàn)了長跳轉(zhuǎn)功能,避免了程序中斷的問題。
此處所說明的附圖用來提供對本發(fā)明的進(jìn)一步理解,構(gòu)成本申請的一部分,本發(fā)明的示意性實(shí)施例及其說明用于解釋本發(fā)明,并不構(gòu)成對本發(fā)明的不當(dāng)限定。在附圖中圖I是根據(jù)本發(fā)明實(shí)施例的熱補(bǔ)丁方法的流程圖;圖2是根據(jù)本發(fā)明優(yōu)選實(shí)施例一的熱補(bǔ)丁技術(shù)的流程圖;圖3是根據(jù)本發(fā)明優(yōu)選實(shí)施例二的熱補(bǔ)丁技術(shù)的流程圖;圖4是根據(jù)本發(fā)明優(yōu)選實(shí)施例三的對靜態(tài)函數(shù)進(jìn)行補(bǔ)丁的流程圖;圖5是根據(jù)本發(fā)明實(shí)施例的熱補(bǔ)丁裝置的結(jié)構(gòu)框圖;圖6是根據(jù)本發(fā)明優(yōu)選實(shí)施例的熱補(bǔ)丁裝置的結(jié)構(gòu)框圖一;
圖7是根據(jù)本發(fā)明優(yōu)選實(shí)施例的熱補(bǔ)丁裝置的結(jié)構(gòu)框圖二 ;圖8是根據(jù)本發(fā)明優(yōu)選實(shí)施例的熱補(bǔ)丁裝置的結(jié)構(gòu)框圖三;圖9是根據(jù)本發(fā)明優(yōu)選實(shí)施例的熱補(bǔ)丁裝置的結(jié)構(gòu)框圖四。
具體實(shí)施例方式需要說明的是,在不沖突的情況下,本申請中的實(shí)施例及實(shí)施例中的特征可以相互組合。下面將參考附圖并結(jié)合實(shí)施例來詳細(xì)說明本發(fā)明。本發(fā)明提供了一種熱補(bǔ)丁方法,圖I是根據(jù)本發(fā)明實(shí)施例的熱補(bǔ)丁方法的流程圖,如圖I所示,包括如下的步驟S102至步驟S104。步驟S102,確定調(diào)用指令與補(bǔ)丁函數(shù)之間的距離超過短跳轉(zhuǎn)指令能夠跳轉(zhuǎn)的范圍。步驟S104,將調(diào)用指令替換為帶索引值的非法指令,其中索引值對應(yīng)于補(bǔ)丁函數(shù)。相關(guān)技術(shù)中,補(bǔ)丁技術(shù)實(shí)現(xiàn)從被補(bǔ)丁函數(shù)重定位到補(bǔ)丁函數(shù)的長跳轉(zhuǎn)至少需要兩條指令,可能導(dǎo)致程序中斷,甚至系統(tǒng)故障。例如,從函數(shù)A跳轉(zhuǎn)到函數(shù)B (此處指長跳轉(zhuǎn)), 現(xiàn)有技術(shù)中至少使用兩條指令實(shí)現(xiàn)該跳轉(zhuǎn)過程,其中,一條或一條以上指令實(shí)現(xiàn)函數(shù)B地址的獲取,一條指令實(shí)現(xiàn)跳轉(zhuǎn)。在熱補(bǔ)丁技術(shù)中,這樣很可能會造成系統(tǒng)崩潰,具體原因如下需要在被補(bǔ)丁函數(shù)首地址處至少修改兩條指令,如指令I(lǐng)NSTl和指令I(lǐng)NST2,而在修改過程中,很有可能某個任務(wù)TASK剛剛執(zhí)行完指令I(lǐng)NSTl,還未執(zhí)行到指令I(lǐng)NST2,就被補(bǔ)丁任務(wù)打斷。如果此時補(bǔ)丁任務(wù)修改了指令I(lǐng)NSTl和指令I(lǐng)NST2為跳轉(zhuǎn)指令,當(dāng)任務(wù)TASK繼續(xù)運(yùn)行時,由于指令I(lǐng)NST2已經(jīng)被修改,且與剛剛執(zhí)行的指令I(lǐng)NSTl完全無法匹配,就會導(dǎo)致CPU計算數(shù)據(jù)錯誤,進(jìn)而引起系統(tǒng)故障。本發(fā)明實(shí)施例中,利用指令異常機(jī)制,將需要執(zhí)行的長跳轉(zhuǎn)指令替換成帶索引值的非法指令,并將該索引值對應(yīng)于補(bǔ)丁函數(shù),這樣,當(dāng)目標(biāo)機(jī)執(zhí)行與該非法指令對應(yīng)的異常處理函數(shù)并返回時可以直接執(zhí)行補(bǔ)丁函數(shù),從而用單條指令實(shí)現(xiàn)了補(bǔ)丁技術(shù)中的長跳轉(zhuǎn)功能,避免了程序中斷的問題??紤]到長跳轉(zhuǎn)指令一般由多條指令組成,前面若干個指令負(fù)責(zé)獲取被調(diào)用函數(shù)的地址,最后一條指令控制PC指針的轉(zhuǎn)移過程。因此,在修改屬于長跳轉(zhuǎn)指令的用于執(zhí)行替換操作的指令時,關(guān)鍵是找到多條指令的最后一條指令。此指令即為真正需要替換的指令。 所以作為本發(fā)明的一個優(yōu)選實(shí)施方式,上述步驟S104包括確定用于執(zhí)行替換操作的指令屬于長跳轉(zhuǎn)指令;獲取用于執(zhí)行替換操作的指令中的用于控制PC指針轉(zhuǎn)移過程的指令;將用于控制PC指針轉(zhuǎn)移過程的指令替換為帶索引值的非法指令。本優(yōu)選實(shí)施方式中,獲取長跳轉(zhuǎn)指令中用于控制PC指針轉(zhuǎn)移過程的指令,即真正需要替換的指令,這樣可以更有針對性的將其替換為帶索引值的非法指令。進(jìn)一步地,獲取用于執(zhí)行替換操作的指令中的用于控制PC指針轉(zhuǎn)移過程的指令包括在用于執(zhí)行替換操作的指令中搜索長跳轉(zhuǎn)指令中的各個指令,得到用于控制PC指針轉(zhuǎn)移過程的指令。上述獲取方式簡便、準(zhǔn)確。另外,考慮到在目標(biāo)機(jī)的內(nèi)存符號表中,一般不存在靜態(tài)符號,所以現(xiàn)有技術(shù)中不能對靜態(tài)函數(shù)打補(bǔ)丁。對此,本發(fā)明提供了一種不需要借助目標(biāo)機(jī)的內(nèi)存符號表的熱補(bǔ)丁方法。
現(xiàn)在嵌入式系統(tǒng)中流行的可執(zhí)行文件格式主要是Linux的ELF。ELF文件標(biāo)準(zhǔn)中將系統(tǒng)采用的ELF格式的文件分為四種可重定位文件、可執(zhí)行文件、共享目標(biāo)文件和核心轉(zhuǎn)儲文件。本發(fā)明所提供的優(yōu)選的熱補(bǔ)丁方法只涉及到可重定位文件和可執(zhí)行文件,就實(shí)現(xiàn)了補(bǔ)丁函數(shù)的定位。其中,可重定位文件中包含的信息有text段、bss段、data段、重定位段、字符表、符號表、debug段等;可執(zhí)行文件中包含的信息有text段、bss段、data段、字符表、符號表、debug段等。上述優(yōu)選的熱補(bǔ)丁方法的基本原理如下分析目標(biāo)機(jī)所使用的可執(zhí)行文件,解析出所有跳轉(zhuǎn)到被補(bǔ)丁函數(shù)的位置,將所有跳轉(zhuǎn)到被補(bǔ)丁函數(shù)的指令調(diào)整為跳轉(zhuǎn)到補(bǔ)丁函數(shù)處,這樣即可實(shí)現(xiàn)補(bǔ)丁的安裝過程。在可執(zhí)行文件中,存在一個名為.symtab的符號表段,與目標(biāo)機(jī)中的內(nèi)存符號表不同,.symtab段包含所有的全局函數(shù)符號和局部函數(shù)符號。但由于可能存在多個靜態(tài)函數(shù)的符號名稱完全相同,所以在實(shí)現(xiàn)對靜態(tài)函數(shù)補(bǔ)丁功能時,需要增加對靜態(tài)函數(shù)所在文件的指定,即指定被補(bǔ)丁函數(shù)位于哪個文件中?;谏鲜鰞?yōu)選的熱補(bǔ)丁方法以及上述分析,本發(fā)明可以通過如下方案解決現(xiàn)有技術(shù)中不能對靜態(tài)函數(shù)打補(bǔ)丁的問題。在圖I所示的步驟S104之前,還需要執(zhí)行如下步驟確定被補(bǔ)丁函數(shù)是靜態(tài)函數(shù); 確定被補(bǔ)丁函數(shù)所屬的文件。優(yōu)選地,確定被補(bǔ)丁函數(shù)所屬的文件包括在映像文件的符號表中查找被補(bǔ)丁函數(shù)所屬的文件的符號;遍歷符號表,查找到與被補(bǔ)丁函數(shù)名稱相同的符號;記錄查找到的符號在符號表中的下標(biāo)。利用確定靜態(tài)函數(shù)所屬的文件,即可唯一確定一個靜態(tài)函數(shù)。優(yōu)選地,在步驟S104之后,上述方法還包括目標(biāo)機(jī)在執(zhí)行與非法指令對應(yīng)的異常處理函數(shù)的過程中,根據(jù)索引值獲取補(bǔ)丁函數(shù)的地址;目標(biāo)機(jī)將異常處理函數(shù)的返回地址修改為補(bǔ)丁函數(shù)地址。下面將結(jié)合實(shí)例對本發(fā)明實(shí)施例的實(shí)現(xiàn)過程進(jìn)行詳細(xì)描述。優(yōu)選實(shí)施例一本發(fā)明的熱補(bǔ)丁方法主要利用CPU的指令異常機(jī)制,將需要執(zhí)行長跳轉(zhuǎn)的指令替換成帶索引值的非法指令,其中,索引值對應(yīng)補(bǔ)丁函數(shù)。當(dāng)CPU執(zhí)行調(diào)用指令(長跳轉(zhuǎn)指令)時,即執(zhí)行替換后的非法指令,產(chǎn)生Program異常,在Program異常處理中,根據(jù)非法指令的索引值獲取補(bǔ)丁函數(shù)的地址(實(shí)際要跳轉(zhuǎn)的位置),將異常處理返回時所要執(zhí)行的PC 指針修改為獲取的補(bǔ)丁函數(shù)的地址,從而實(shí)現(xiàn)熱補(bǔ)丁技術(shù)中單條指令的長跳轉(zhuǎn)功能。圖2是根據(jù)本發(fā)明優(yōu)選實(shí)施例一的熱補(bǔ)丁技術(shù)的流程圖,如圖2所示,包括如下的步驟S202至步驟S212。步驟S202,創(chuàng)建帶索引值的非法指令表,建立非法指令與目的地址(補(bǔ)丁函數(shù)的地址)的映射關(guān)系。步驟S204,將調(diào)用指令修改為帶索引值(映射關(guān)系)的非法指令,每個索引值對應(yīng)一個補(bǔ)丁函數(shù)。此處需要確定調(diào)用指令本身屬于長跳轉(zhuǎn)指令還是短跳轉(zhuǎn)指令。長跳轉(zhuǎn)指令實(shí)施較為復(fù)雜,這是由于長跳轉(zhuǎn)指令本身一般由多條指令組成,前面若干個指令負(fù)責(zé)獲取被調(diào)用函數(shù)的地址,最后一條指令控制PC指針的轉(zhuǎn)移過程。在修改長跳轉(zhuǎn)指令時,關(guān)鍵是找到多條長跳轉(zhuǎn)指令的最后一條指令。雖然此指令并不出現(xiàn)在重定位指令列表內(nèi),但一般會出現(xiàn)在前面多條指令之后,所以可以在重定位表中根據(jù)前面的長跳轉(zhuǎn)指令搜索到最后的這條指令,最后的這條指令即為真正需要替換的指令。如果調(diào)用指令本身為短跳轉(zhuǎn)指令,則該指令本身為真正需要替換的指令,且出現(xiàn)在重定位表中,不需要做額外的搜索操作。步驟S206,當(dāng)CPU執(zhí)行帶索引值的非法指令時,產(chǎn)生Program異常。步驟S208,在Program異常處理函數(shù)中,根據(jù)非法指令索引值獲取相應(yīng)的補(bǔ)丁函數(shù)的地址。步驟S210,將異常返回PC指令地址修改為補(bǔ)丁函數(shù)的地址。步驟S212,CPU從PiOgram異常返回至補(bǔ)丁函數(shù)處,直接執(zhí)行目的地址(即補(bǔ)丁函數(shù)處)的指令。補(bǔ)丁函數(shù)執(zhí)行完畢后,CPU返回到被補(bǔ)丁函數(shù)的下一條指令處繼續(xù)執(zhí)行。優(yōu)選實(shí)施例二圖3是根據(jù)本發(fā)明優(yōu)選實(shí)施例二的熱補(bǔ)丁技術(shù)的流程圖,如圖3所示,包括如下的步驟S302至步驟S320。步驟S302,文本編輯器編寫補(bǔ)丁函數(shù)A,生成補(bǔ)丁源文件,經(jīng)過編譯器處理后,生成可重定位目標(biāo)文件B。步驟S304,判斷被補(bǔ)丁函數(shù)D是靜態(tài)函數(shù)還是全局函數(shù)。如果被補(bǔ)丁函數(shù)D是靜態(tài)函數(shù),則執(zhí)行步驟S306。如果被補(bǔ)丁函數(shù)D是全局函數(shù),則執(zhí)行步驟S308。步驟S306,確定被補(bǔ)丁函數(shù)D所在的文件G,遍歷映像文件C的符號表,查找與文件G對應(yīng)的符號H,記錄其在符號表中的下標(biāo)symbollndex。如果找到對應(yīng)的符號H,則執(zhí)行步驟S310。如果沒找到對應(yīng)的符號H,則執(zhí)行步驟S312。步驟S308,遍歷映像文件C的符號表,查找與被補(bǔ)丁函數(shù)D對應(yīng)的符號,記錄其在符號表中的下標(biāo)。步驟S310,遍歷映像文件C的符號表中H之后的所有函數(shù)類符號。步驟S312,失敗退出。步驟S314,判斷是否找到函數(shù)名稱為A的符號。若找到,則執(zhí)行步驟S316。若沒找到,則執(zhí)行步驟S318。步驟S316,記錄該符號在符號表中的索引i。步驟S318,是否遇到下一個文件名符號。若是,則執(zhí)行步驟S312,若否,則執(zhí)行步驟 S310。步驟S320,補(bǔ)丁制作工具遍歷映像文件C的重定位表,找到所有和symbol Index相同的重定位表段入口。步驟S322,補(bǔ)丁制作工具將重定位表段與其關(guān)聯(lián)的符號生成補(bǔ)丁信息E。將補(bǔ)丁信息E和可重定位目標(biāo)文件B整合在一起,形成補(bǔ)丁文件F。這里,假設(shè)映像文件C中存在靜態(tài)函數(shù)的重定位表,如果沒有,可以通過修改鏈接腳本來保留靜態(tài)函數(shù)的重定位段信息。通過重定位入口,即可定位出所有需要被重定位的指令在內(nèi)存中運(yùn)行的偏移地址,即被補(bǔ)丁函數(shù)D在“何處被引用”的指令地址,以及指令的修正方式。將這些重定位入口從映像文件C提取出來,并和其關(guān)聯(lián)的符號生成補(bǔ)丁信息E。目標(biāo)機(jī)中補(bǔ)丁控制任務(wù)處理輸入,接受加載補(bǔ)丁文件的請求,并將補(bǔ)丁文件放在
8目標(biāo)機(jī)的預(yù)留的補(bǔ)丁緩沖區(qū)內(nèi)。補(bǔ)丁控制任務(wù)解析新補(bǔ)丁文件,將補(bǔ)丁文件的代碼段和數(shù)據(jù)段加載到內(nèi)存中特定的位置,并記錄每個補(bǔ)丁函數(shù)在內(nèi)存中的地址。補(bǔ)丁控制任務(wù)解析補(bǔ)丁文件,抽取補(bǔ)丁信息E,E包含了所有需要重定位的指令的地址,它們的值由當(dāng)前補(bǔ)丁函數(shù)A在內(nèi)存中的運(yùn)行地址和E中指定的指令修正方式來確定。另外,還需檢查需要修改的指令地址和補(bǔ)丁函數(shù)地址的距離是否超過了短跳轉(zhuǎn)的范圍。如果沒有超過,按照重定位規(guī)則修改指令即可。如果超過了,則需要通過單指令長跳轉(zhuǎn)的方法來修改指令。指令修改完畢后,調(diào)用被補(bǔ)丁函數(shù)處的指令修改為跳轉(zhuǎn)到補(bǔ)丁函數(shù)起始地址的函數(shù)跳轉(zhuǎn)指令,當(dāng)CPU 調(diào)用被補(bǔ)丁函數(shù)時,實(shí)際上是跳轉(zhuǎn)到補(bǔ)丁函數(shù)入口,執(zhí)行補(bǔ)丁函數(shù)。以此實(shí)現(xiàn)了在不中斷程序的情況下對程序進(jìn)行修改。優(yōu)選實(shí)施例三在嵌入式系統(tǒng)中,存在大量的靜態(tài)函數(shù),這些靜態(tài)函數(shù)和全局函數(shù)一樣,同樣會存在實(shí)現(xiàn)補(bǔ)丁的需求。但在嵌入式式系統(tǒng)目標(biāo)機(jī)的內(nèi)存符號表中,一般不會存在有靜態(tài)符號。 同時,由于不同文件中的靜態(tài)函數(shù)可以取相同的名字,依賴現(xiàn)有技術(shù)方案無法實(shí)現(xiàn)靜態(tài)函數(shù)的補(bǔ)丁功能。本發(fā)明中,由于完全利用了可重定位文件和可執(zhí)行文件來實(shí)現(xiàn)補(bǔ)丁函數(shù)的定位,不再借助目標(biāo)機(jī)中的內(nèi)存符號表,使得對靜態(tài)函數(shù)實(shí)現(xiàn)補(bǔ)丁功能成為可能。在可執(zhí)行文件中,存在一個名為.symtab的符號表段,與目標(biāo)機(jī)中的內(nèi)存符號表不同,.symtab段包含所有的全局函數(shù)符號和局部函數(shù)符號。但由于可能存在多個靜態(tài)函數(shù)的符號名稱完全相同,所以在實(shí)現(xiàn)對靜態(tài)函數(shù)補(bǔ)丁功能時,需要增加對靜態(tài)函數(shù)所在文件的指定,即指定被補(bǔ)丁函數(shù)是位于哪個文件中。圖4是根據(jù)本發(fā)明優(yōu)選實(shí)施例三的對靜態(tài)函數(shù)進(jìn)行補(bǔ)丁的流程圖,如圖4所示,包括如下的步驟S402至步驟S404。步驟S402,確定被補(bǔ)丁函數(shù)D (此優(yōu)選實(shí)施例中,D為靜態(tài)函數(shù))所在的文件G,補(bǔ)丁制作工具解析目標(biāo)機(jī)中運(yùn)行所使用的映像文件C,查找定義文件G的符號H,如果沒有找到,則失敗退出。這里,類型為FILE的符號所對應(yīng)的名稱即為文件名,類型為FUNC的符號所對應(yīng)的名稱即為函數(shù)名,遍歷符號表即可找到名稱為G的符號H。步驟S404,在映像文件C的符號表中找到符號H后,遍歷之后出現(xiàn)的所有函數(shù)類符號,直到出現(xiàn)下一個文件符號。如果找到和被補(bǔ)丁函數(shù)D名稱相同的符號,記錄該符號在符號表中的下標(biāo)symbol Index。如果沒有找到,貝U失敗退出。需要說明的是,在附圖的流程圖示出的步驟可以在諸如一組計算機(jī)可執(zhí)行指令的計算機(jī)系統(tǒng)中執(zhí)行,并且,雖然在流程圖中示出了邏輯順序,但是在某些情況下,可以以不同于此處的順序執(zhí)行所示出或描述的步驟。本發(fā)明實(shí)施例提供了一種熱補(bǔ)丁裝置,該熱補(bǔ)丁裝置可以用于實(shí)現(xiàn)上述熱補(bǔ)丁方法。圖5是根據(jù)本發(fā)明實(shí)施例的熱補(bǔ)丁裝置的結(jié)構(gòu)框圖,如圖5所示,包括第一確定模塊52 和替換模塊54。下面對其結(jié)構(gòu)進(jìn)行詳細(xì)描述。第一確定模塊52,用于確定調(diào)用指令與補(bǔ)丁函數(shù)之間的距離超過短跳轉(zhuǎn)指令能夠跳轉(zhuǎn)的范圍;替換模塊54,連接至第一確定模塊52,用于將第一確定模塊52確定是長跳轉(zhuǎn)指令的調(diào)用指令替換為帶索引值的非法指令,其中索引值對應(yīng)于補(bǔ)丁函數(shù)。上述實(shí)施例利用指令異常機(jī)制,將第一確定模塊52確定是長跳轉(zhuǎn)指令的調(diào)用指令由替換模塊54替換成帶索引值的非法指令,并將該索引值對應(yīng)于補(bǔ)丁函數(shù),這樣,當(dāng)目標(biāo)機(jī)執(zhí)行與該非法指令對應(yīng)的異常處理函數(shù)并返回時可以直接執(zhí)行補(bǔ)丁函數(shù),從而用單條指令實(shí)現(xiàn)了補(bǔ)丁技術(shù)中的長跳轉(zhuǎn)功能,避免了程序中斷的問題??紤]到長跳轉(zhuǎn)指令一般由多條指令組成,前面若干個指令負(fù)責(zé)獲取被調(diào)用函數(shù)的地址,最后一條指令控制PC指針的轉(zhuǎn)移過程。因此,在修改屬于長跳轉(zhuǎn)指令的用于執(zhí)行替換操作的指令時,需要找到多條指令的最后一條指令。所以,本發(fā)明提供了以下優(yōu)選方案, 圖6是根據(jù)本發(fā)明優(yōu)選實(shí)施例的熱補(bǔ)丁裝置的結(jié)構(gòu)框圖一,如圖6所示,替換模塊54包括: 確定子模塊542,用于確定用于執(zhí)行替換操作的指令屬于長跳轉(zhuǎn)指令;獲取子模塊544,連接至確定子模塊542,用于獲取用于執(zhí)行替換操作的指令中的用于控制PC指針轉(zhuǎn)移過程的指令;替換子模塊546,連接至獲取子模塊544,用于將獲取子模塊544獲取的用于控制PC 指針轉(zhuǎn)移過程的指令替換為帶索引值的非法指令。圖7是根據(jù)本發(fā)明優(yōu)選實(shí)施例的熱補(bǔ)丁裝置的結(jié)構(gòu)框圖二,如圖7所示,獲取子模塊544包括搜索單元5442,用于在用于執(zhí)行替換操作的指令中搜索長跳轉(zhuǎn)指令,得到用于控制PC指針轉(zhuǎn)移過程的指令。圖8是根據(jù)本發(fā)明優(yōu)選實(shí)施例的熱補(bǔ)丁裝置的結(jié)構(gòu)框圖三,如圖8所示,上述裝置還包括第二確定模塊56,用于確定被補(bǔ)丁函數(shù)是靜態(tài)函數(shù);第三確定模塊58,連接至第二確定模塊56,用于確定由第二確定模塊56確定是靜態(tài)函數(shù)的被補(bǔ)丁函數(shù)所屬的文件。圖9是根據(jù)本發(fā)明優(yōu)選實(shí)施例的熱補(bǔ)丁裝置的結(jié)構(gòu)框圖四,如圖9所示,第三確定模塊58包括查找子模塊582,用于在映像文件的符號表中查找被補(bǔ)丁函數(shù)所屬的文件的符號;遍歷子模塊584,連接至查找子模塊582,用于遍歷符號表,查找到與被補(bǔ)丁函數(shù)名稱相同的符號;記錄子模塊586,連接至遍歷子模塊584,用于記錄遍歷子模塊584遍歷以后查找到的與被補(bǔ)丁函數(shù)名稱相同的符號在符號表中的下標(biāo)。需要說明的是,裝置實(shí)施例中描述的熱補(bǔ)丁裝置對應(yīng)于上述的方法實(shí)施例,其具體的實(shí)現(xiàn)過程在方法實(shí)施例中已經(jīng)進(jìn)行過詳細(xì)說明,在此不再贅述。綜上所述,根據(jù)本發(fā)明的上述實(shí)施例,提供了一種熱補(bǔ)丁方法及裝置。本發(fā)明利用指令異常機(jī)制,將調(diào)用指令替換成帶索引值的非法指令,并將該索引值對應(yīng)于補(bǔ)丁函數(shù),這樣,當(dāng)目標(biāo)機(jī)執(zhí)行與該非法指令對應(yīng)的異常處理函數(shù)并返回時可以直接執(zhí)行補(bǔ)丁函數(shù),從而用單條指令實(shí)現(xiàn)了長跳轉(zhuǎn)功能,避免了程序中斷的問題。顯然,本領(lǐng)域的技術(shù)人員應(yīng)該明白,上述的本發(fā)明的各模塊或各步驟可以用通用的計算裝置來實(shí)現(xiàn),它們可以集中在單個的計算裝置上,或者分布在多個計算裝置所組成的網(wǎng)絡(luò)上,可選地,它們可以用計算裝置可執(zhí)行的程序代碼來實(shí)現(xiàn),從而,可以將它們存儲在存儲裝置中由計算裝置來執(zhí)行,或者將它們分別制作成各個集成電路模塊,或者將它們中的多個模塊或步驟制作成單個集成電路模塊來實(shí)現(xiàn)。這樣,本發(fā)明不限制于任何特定的硬件和軟件結(jié)合。以上所述僅為本發(fā)明的優(yōu)選實(shí)施例而已,并不用于限制本發(fā)明,對于本領(lǐng)域的技術(shù)人員來說,本發(fā)明可以有各種更改和變化。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
10
權(quán)利要求
1.一種熱補(bǔ)丁方法,其特征在于包括確定調(diào)用指令與補(bǔ)丁函數(shù)之間的距離超過短跳轉(zhuǎn)指令能夠跳轉(zhuǎn)的范圍;將所述調(diào)用指令替換為帶索引值的非法指令,其中所述索引值對應(yīng)于所述補(bǔ)丁函數(shù)。
2.根據(jù)權(quán)利要求I所述的方法,其特征在于,將所述調(diào)用指令替換為帶索引值的非法指令包括確定用于執(zhí)行所述替換操作的指令屬于長跳轉(zhuǎn)指令;獲取所述用于執(zhí)行所述替換操作的指令中的用于控制PC指針轉(zhuǎn)移過程的指令;將所述用于控制PC指針轉(zhuǎn)移過程的指令替換為帶索引值的非法指令。
3.根據(jù)權(quán)利要求2所述的方法,其特征在于,獲取所述用于執(zhí)行所述替換操作的指令中的用于控制PC指針轉(zhuǎn)移過程的指令包括在所述用于執(zhí)行所述替換操作的指令中搜索長跳轉(zhuǎn)指令,得到所述用于控制PC指針轉(zhuǎn)移過程的指令。
4.根據(jù)權(quán)利要求I所述的方法,其特征在于,在將所述調(diào)用指令替換為帶索引值的非法指令之前,還包括確定所述被補(bǔ)丁函數(shù)是靜態(tài)函數(shù);確定所述被補(bǔ)丁函數(shù)所屬的文件;在所述文件中,執(zhí)行將所述調(diào)用指令替換為帶索引值的非法指令的操作。
5.根據(jù)權(quán)利要求4所述的方法,其特征在于,確定所述被補(bǔ)丁函數(shù)所屬的文件包括在映像文件的符號表中查找所述被補(bǔ)丁函數(shù)所屬的文件的符號;遍歷所述符號表,查找與所述符號的名稱相同的符號;記錄查找到的所述符號在所述符號表中的下標(biāo)。
6.根據(jù)權(quán)利要求I至5中任一項所述的方法,其特征在于,在將所述調(diào)用指令替換為帶索引值的非法指令之后,還包括目標(biāo)機(jī)接收到替換后的所述調(diào)用指令;所述目標(biāo)機(jī)在執(zhí)行與所述非法指令對應(yīng)的異常處理函數(shù)的過程中,根據(jù)所述索引值獲取所述補(bǔ)丁函數(shù)的地址;所述目標(biāo)機(jī)將所述異常處理函數(shù)的返回地址修改為所述補(bǔ)丁函數(shù)地址。
7.一種熱補(bǔ)丁裝置,其特征在于包括第一確定模塊,用于確定調(diào)用指令與補(bǔ)丁函數(shù)之間的距離超過短跳轉(zhuǎn)指令能夠跳轉(zhuǎn)的范圍;替換模塊,用于將所述調(diào)用指令替換為帶索引值的非法指令,其中所述索引值對應(yīng)于所述補(bǔ)丁函數(shù)。
8.根據(jù)權(quán)利要求7所述的裝置,其特征在于,所述替換模塊包括確定子模塊,用于確定用于執(zhí)行所述替換操作的指令屬于長跳轉(zhuǎn)指令;獲取子模塊,用于獲取所述用于執(zhí)行所述替換操作的指令中的用于控制PC指針轉(zhuǎn)移過程的指令;替換子模塊,用于將所述用于控制PC指針轉(zhuǎn)移過程的指令替換為帶索引值的非法指令。
9.根據(jù)權(quán)利要求8所述的裝置,其特征在于,所述獲取子模塊包括搜索單元,用于在所述用于執(zhí)行所述替換操作的指令中搜索長跳轉(zhuǎn)指令,得到所述用于控制PC指針轉(zhuǎn)移過程的指令。
10.根據(jù)權(quán)利要求7所述的裝置,其特征在于,所述裝置還包括 第二確定模塊,用于確定所述被補(bǔ)丁函數(shù)是靜態(tài)函數(shù);第三確定模塊,用于確定所述被補(bǔ)丁函數(shù)所屬的文件。
全文摘要
本發(fā)明公開了一種熱補(bǔ)丁方法及裝置,該方法包括確定調(diào)用指令與補(bǔ)丁函數(shù)之間的距離超過短跳轉(zhuǎn)指令能夠跳轉(zhuǎn)的范圍;將調(diào)用指令替換為帶索引值的非法指令,其中索引值對應(yīng)于補(bǔ)丁函數(shù)。本發(fā)明利用指令異常機(jī)制,將調(diào)用指令替換成帶索引值的非法指令,并將該索引值對應(yīng)于補(bǔ)丁函數(shù),這樣,當(dāng)目標(biāo)機(jī)執(zhí)行與該非法指令對應(yīng)的異常處理函數(shù)并返回時可以直接執(zhí)行補(bǔ)丁函數(shù),從而用單條指令實(shí)現(xiàn)了長跳轉(zhuǎn)功能,避免了程序中斷的問題。
文檔編號G06F9/32GK102609241SQ20121001814
公開日2012年7月25日 申請日期2012年1月19日 優(yōu)先權(quán)日2012年1月19日
發(fā)明者朱明星, 阮芳芳 申請人:中興通訊股份有限公司