一種熱補(bǔ)丁方法及設(shè)備的制造方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明實(shí)施例涉及通信領(lǐng)域,尤其涉及一種熱補(bǔ)丁方法及設(shè)備。
【背景技術(shù)】
[0002]隨著技術(shù)和管理的進(jìn)步,盡管已將投入大量的人力和精力提升軟件的質(zhì)量,但是仍然難以完全消除軟件的缺陷,而且目前程序按迭代進(jìn)行開發(fā),功能在每個(gè)迭代中逐步添加。當(dāng)需要修復(fù)軟件的缺陷或者為軟件增加功能時(shí),為了不中斷應(yīng)用程序的正常使用進(jìn)程,一般以熱補(bǔ)丁的方式對(duì)該應(yīng)用程序進(jìn)行漏洞修復(fù)或更新,即在不中止應(yīng)用程序的情況下對(duì)該應(yīng)用程序進(jìn)行修復(fù)或更新。熱補(bǔ)丁的處理方式基本是以函數(shù)為單位的,即可通過對(duì)出現(xiàn)漏洞或需要更新的函數(shù)進(jìn)行修復(fù),以實(shí)現(xiàn)對(duì)該應(yīng)用程序的修復(fù)。
[0003]現(xiàn)有技術(shù)中,若被補(bǔ)丁函數(shù)重定位到補(bǔ)丁函數(shù)之間的距離過長,則需要進(jìn)行長跳轉(zhuǎn),但是補(bǔ)丁技術(shù)中實(shí)現(xiàn)從被補(bǔ)丁函數(shù)重定位到補(bǔ)丁函數(shù)的長跳轉(zhuǎn)至少需要兩條指令,可能導(dǎo)致程序中斷,甚至系統(tǒng)故障。
[0004]舉例來說,從函數(shù)A通過長跳轉(zhuǎn)跳轉(zhuǎn)到函數(shù)B,現(xiàn)有技術(shù)中至少使用兩條指令實(shí)現(xiàn)該跳轉(zhuǎn)過程,其中,一條或一條以上指令實(shí)現(xiàn)函數(shù)B地址的獲取,一條指令實(shí)現(xiàn)跳轉(zhuǎn)。在熱補(bǔ)丁技術(shù)中,這樣很可能會(huì)造成系統(tǒng)崩潰,具體原因如下:需要在被補(bǔ)丁函數(shù)首地址處至少修改兩條指令,如指令I(lǐng)NSTl和指令I(lǐng)NST2,而在修改過程中,很有可能某個(gè)任務(wù)(task)剛剛執(zhí)行完指令I(lǐng)NSTl,還未執(zhí)行到指令I(lǐng)NST2,就被補(bǔ)丁任務(wù)打斷。如果此時(shí)補(bǔ)丁任務(wù)修改了指令I(lǐng)NSTl和指令I(lǐng)NST2為跳轉(zhuǎn)指令,當(dāng)任務(wù)繼續(xù)運(yùn)行時(shí),由于指令I(lǐng)NST2已經(jīng)被修改,且與剛剛執(zhí)行的指令I(lǐng)NSTl完全無法匹配,就會(huì)導(dǎo)致中央處理器(Central Processing Unit,簡稱CPU)計(jì)算數(shù)據(jù)錯(cuò)誤,進(jìn)而引起系統(tǒng)故障。
[0005]綜上,亟需一種熱補(bǔ)丁方法及設(shè)備,用于在被補(bǔ)丁函數(shù)與補(bǔ)丁函數(shù)之間的距離過長時(shí),減小熱補(bǔ)丁進(jìn)程導(dǎo)致的系統(tǒng)中斷和系統(tǒng)故障發(fā)生的概率。
【發(fā)明內(nèi)容】
[0006]本發(fā)明實(shí)施例提供一種熱補(bǔ)丁方法及設(shè)備,用于在被補(bǔ)丁函數(shù)與補(bǔ)丁函數(shù)之間的距離過長時(shí),減小熱補(bǔ)丁進(jìn)程導(dǎo)致的系統(tǒng)中斷和系統(tǒng)故障發(fā)生的概率。
[0007]本發(fā)明實(shí)施例提供一種熱補(bǔ)丁方法,包括:
[0008]在確定待修復(fù)程序的代碼中的被補(bǔ)丁函數(shù)與補(bǔ)丁函數(shù)之間的距離大于短跳轉(zhuǎn)的最大跳轉(zhuǎn)范圍時(shí),獲取跳轉(zhuǎn)函數(shù)信息表;其中,跳轉(zhuǎn)函數(shù)信息表包括預(yù)先在待修復(fù)程序的代碼中插入的多個(gè)跳轉(zhuǎn)函數(shù)中的每個(gè)跳轉(zhuǎn)函數(shù)的地址以及使用情況;
[0009]根據(jù)跳轉(zhuǎn)函數(shù)信息表中包括的每個(gè)跳轉(zhuǎn)函數(shù)的地址以及使用情況,從跳轉(zhuǎn)函數(shù)信息表中確定出處于未使用狀態(tài)的至少一個(gè)跳轉(zhuǎn)函數(shù);其中,至少一個(gè)跳轉(zhuǎn)函數(shù)至少包括第一跳轉(zhuǎn)函數(shù);第一跳轉(zhuǎn)函數(shù)與被補(bǔ)丁函數(shù)之間的距離不大于短跳轉(zhuǎn)的最大跳轉(zhuǎn)范圍;
[0010]根據(jù)確定出的至少一個(gè)跳轉(zhuǎn)函數(shù),生成跳轉(zhuǎn)通道;其中,跳轉(zhuǎn)通道以第一跳轉(zhuǎn)函數(shù)為起始跳轉(zhuǎn)函數(shù),跳轉(zhuǎn)通道最后跳轉(zhuǎn)至補(bǔ)丁函數(shù);
[0011]在被補(bǔ)丁函數(shù)前添加第一短跳轉(zhuǎn)函數(shù),其中,第一短跳轉(zhuǎn)函數(shù)用于從被補(bǔ)丁函數(shù)跳轉(zhuǎn)至跳轉(zhuǎn)通道中的第一跳轉(zhuǎn)函數(shù),進(jìn)而通過跳轉(zhuǎn)通道跳轉(zhuǎn)至補(bǔ)丁函數(shù)。
[0012]可選地,根據(jù)確定出的至少一個(gè)跳轉(zhuǎn)函數(shù),生成跳轉(zhuǎn)通道,具體包括:
[0013]若確定至少一個(gè)跳轉(zhuǎn)函數(shù)滿足第一條件,則:
[0014]在確定第一跳轉(zhuǎn)函數(shù)不是短跳轉(zhuǎn)函數(shù)時(shí),將第一跳轉(zhuǎn)函數(shù)設(shè)置為短跳轉(zhuǎn)函數(shù);
[0015]在確定至少一個(gè)跳轉(zhuǎn)函數(shù)中還包括的N個(gè)第二跳轉(zhuǎn)函數(shù)中任一個(gè)第二跳轉(zhuǎn)函數(shù)不是短跳轉(zhuǎn)函數(shù)時(shí),將不是短跳轉(zhuǎn)函數(shù)的第二跳轉(zhuǎn)函數(shù)設(shè)置為短跳轉(zhuǎn)函數(shù);
[0016]根據(jù)確定出的均為短跳轉(zhuǎn)函數(shù)的第一跳轉(zhuǎn)函數(shù)和N個(gè)第三跳轉(zhuǎn)函數(shù),生成由第一跳轉(zhuǎn)函數(shù)和N個(gè)第三跳轉(zhuǎn)函數(shù)組成的跳轉(zhuǎn)通道;其中,跳轉(zhuǎn)通道中的最后一個(gè)第二跳轉(zhuǎn)函數(shù)跳轉(zhuǎn)至補(bǔ)丁函數(shù);
[0017]其中,第一條件為:第一跳轉(zhuǎn)函數(shù)和N個(gè)第二跳轉(zhuǎn)函數(shù)均為短跳轉(zhuǎn)函數(shù)時(shí),為短跳轉(zhuǎn)函數(shù)的第一跳轉(zhuǎn)函數(shù)和N個(gè)第二跳轉(zhuǎn)函數(shù)的總的執(zhí)行時(shí)間不長于一個(gè)長跳轉(zhuǎn)函數(shù)的執(zhí)行時(shí)間。
[0018]可選地,跳轉(zhuǎn)函數(shù)信息表中還包括每個(gè)跳轉(zhuǎn)函數(shù)的函數(shù)名;
[0019]根據(jù)確定出的均為短跳轉(zhuǎn)函數(shù)的第一跳轉(zhuǎn)函數(shù)和N個(gè)第二跳轉(zhuǎn)函數(shù),生成由第一跳轉(zhuǎn)函數(shù)和N個(gè)第二跳轉(zhuǎn)函數(shù)組成的跳轉(zhuǎn)通道之后,還包括:
[0020]從跳轉(zhuǎn)函數(shù)信息表中,將第一跳轉(zhuǎn)函數(shù)和N個(gè)第二跳轉(zhuǎn)函數(shù)的函數(shù)名更改為短跳轉(zhuǎn)函數(shù)的函數(shù)名;
[0021]從跳轉(zhuǎn)函數(shù)信息表中,將第一跳轉(zhuǎn)函數(shù)和N個(gè)第二跳轉(zhuǎn)函數(shù)的使用情況標(biāo)識(shí)為已使用狀態(tài)。
[0022]可選地,根據(jù)確定出的至少一個(gè)跳轉(zhuǎn)函數(shù),生成跳轉(zhuǎn)通道,具體包括:
[0023]若確定至少一個(gè)跳轉(zhuǎn)函數(shù)不滿足第一條件,則:
[0024]在確定第一跳轉(zhuǎn)函數(shù)不是長跳轉(zhuǎn)函數(shù)時(shí),將第一跳轉(zhuǎn)函數(shù)設(shè)置為長跳轉(zhuǎn)函數(shù);
[0025]根據(jù)設(shè)置為長跳轉(zhuǎn)函數(shù)的第一跳轉(zhuǎn)函數(shù),生成由第一跳轉(zhuǎn)函數(shù)組成的跳轉(zhuǎn)通道;跳轉(zhuǎn)通道中的設(shè)置為長跳轉(zhuǎn)函數(shù)的第一跳轉(zhuǎn)函數(shù)跳轉(zhuǎn)至補(bǔ)丁函數(shù)。
[0026]可選地,跳轉(zhuǎn)函數(shù)信息表中還包括每個(gè)跳轉(zhuǎn)函數(shù)的函數(shù)名;
[0027]根據(jù)設(shè)置為長跳轉(zhuǎn)函數(shù)的第一跳轉(zhuǎn)函數(shù),生成由第一跳轉(zhuǎn)函數(shù)組成的跳轉(zhuǎn)通道之后,還包括:
[0028]從跳轉(zhuǎn)函數(shù)信息表中,將第一跳轉(zhuǎn)函數(shù)的函數(shù)名更改為長跳轉(zhuǎn)函數(shù)的函數(shù)名;
[0029]從跳轉(zhuǎn)函數(shù)信息表中,將第一跳轉(zhuǎn)函數(shù)的使用情況標(biāo)識(shí)為已使用狀態(tài)。
[0030]可選地,獲取跳轉(zhuǎn)函數(shù)信息表之前,還包括:
[0031 ]在待修復(fù)程序的代碼中確定多個(gè)位置點(diǎn);
[0032]通過對(duì)待修復(fù)程序的鏈接腳本進(jìn)行修改,在多個(gè)位置點(diǎn)中的每個(gè)位置點(diǎn)插入多個(gè)跳轉(zhuǎn)函數(shù);
[0033]統(tǒng)一抽取待修復(fù)程序的代碼中插入的所有跳轉(zhuǎn)函數(shù)中的每個(gè)跳轉(zhuǎn)函數(shù)的函數(shù)名、地址以及使用情況,生成跳轉(zhuǎn)函數(shù)信息表。
[0034]可選地,多個(gè)位置點(diǎn)中的任一個(gè)位置點(diǎn)插入的多個(gè)跳轉(zhuǎn)函數(shù)為短跳轉(zhuǎn)函數(shù)和/或長跳轉(zhuǎn)函數(shù);
[0035]若多個(gè)位置點(diǎn)中的一個(gè)位置點(diǎn)插入的多個(gè)跳轉(zhuǎn)函數(shù)為短跳轉(zhuǎn)函數(shù),則該位置點(diǎn)插入的多個(gè)跳轉(zhuǎn)函數(shù)中的至少一個(gè)跳轉(zhuǎn)函數(shù)所占用的位置范圍為一個(gè)長跳轉(zhuǎn)函數(shù)所占用的位置范圍。
[0036]可選地,多個(gè)位置點(diǎn)中的相鄰的兩個(gè)位置點(diǎn)之間的距離不大于短跳轉(zhuǎn)的最大跳轉(zhuǎn)范圍;或者
[0037]多個(gè)位置點(diǎn)中的每個(gè)位置點(diǎn)位于待修復(fù)程序的所有代碼中包括的相鄰兩段代碼中間的位置。
[0038]本發(fā)明實(shí)施例提供一種熱補(bǔ)丁設(shè)備,包括:
[0039]獲取單元,用于在確定待修復(fù)程序的代碼中的被補(bǔ)丁函數(shù)與補(bǔ)丁函數(shù)之間的距離大于短跳轉(zhuǎn)的最大跳轉(zhuǎn)范圍時(shí),獲取跳轉(zhuǎn)函數(shù)信息表;其中,跳轉(zhuǎn)函數(shù)信息表包括預(yù)先在待修復(fù)程序的代碼中插入的多個(gè)跳轉(zhuǎn)函數(shù)中的每個(gè)跳轉(zhuǎn)函數(shù)的地址以及使用情況;
[0040]確定單元,用于根據(jù)跳轉(zhuǎn)函數(shù)信息表中包括的每個(gè)跳轉(zhuǎn)函數(shù)的地址以及使用情況,從跳轉(zhuǎn)函數(shù)信息表中確定出處于未使用狀態(tài)的至少一個(gè)跳轉(zhuǎn)函數(shù);其中,至少一個(gè)跳轉(zhuǎn)函數(shù)至少包括第一跳轉(zhuǎn)函數(shù);第一跳轉(zhuǎn)函數(shù)與被補(bǔ)丁函數(shù)之間的距離不大于短跳轉(zhuǎn)的最大跳轉(zhuǎn)范圍;
[0041]生成單元,用于根據(jù)確定出的至少一個(gè)跳轉(zhuǎn)函數(shù),生成跳轉(zhuǎn)通道;其中,跳轉(zhuǎn)通道以第一跳轉(zhuǎn)函數(shù)為起始跳轉(zhuǎn)函數(shù),跳轉(zhuǎn)通道最后跳轉(zhuǎn)至補(bǔ)丁函數(shù);
[0042]處理單元,用于在被補(bǔ)丁函數(shù)前添加第一短跳轉(zhuǎn)函數(shù),其中,第一短跳轉(zhuǎn)函數(shù)用于從被補(bǔ)丁函數(shù)跳轉(zhuǎn)至跳轉(zhuǎn)通道中的第一跳轉(zhuǎn)函數(shù),進(jìn)而通過跳轉(zhuǎn)通道跳轉(zhuǎn)至補(bǔ)丁函數(shù)。
[0043]可選地,生成單元,具體用于:
[0044]若確定至少一個(gè)跳轉(zhuǎn)函數(shù)滿足第一條件,則:
[0045]在確定第一跳轉(zhuǎn)函數(shù)不是短跳轉(zhuǎn)函數(shù)時(shí),將第一跳轉(zhuǎn)函數(shù)設(shè)置為短跳轉(zhuǎn)函數(shù);
[0046]在確定至少一個(gè)跳轉(zhuǎn)函數(shù)中還包括的N個(gè)第二跳轉(zhuǎn)函數(shù)中任一個(gè)第二跳轉(zhuǎn)函數(shù)不是短跳轉(zhuǎn)函數(shù)時(shí),將不是短跳轉(zhuǎn)函數(shù)的第二跳轉(zhuǎn)函數(shù)設(shè)置為短跳轉(zhuǎn)函數(shù);
[0047]根據(jù)確定出的均為短跳轉(zhuǎn)函數(shù)的第一跳轉(zhuǎn)函數(shù)和N個(gè)第三跳轉(zhuǎn)函數(shù),生成由第一跳轉(zhuǎn)函數(shù)和N個(gè)第三跳轉(zhuǎn)函數(shù)組成的跳轉(zhuǎn)通道;其中,跳轉(zhuǎn)通道中的最后一個(gè)第二跳轉(zhuǎn)函數(shù)跳轉(zhuǎn)至補(bǔ)丁函數(shù);
[0048]其中,第一條件為:第一跳轉(zhuǎn)函數(shù)和N個(gè)第二跳轉(zhuǎn)函數(shù)均為短跳轉(zhuǎn)函數(shù)時(shí),為短跳轉(zhuǎn)函數(shù)的第一跳轉(zhuǎn)函數(shù)和N個(gè)第二跳轉(zhuǎn)函數(shù)的總的執(zhí)行時(shí)間不長于一個(gè)長跳轉(zhuǎn)函數(shù)的執(zhí)行時(shí)間。
[0049]可選地,跳轉(zhuǎn)函數(shù)信息表中還包括每個(gè)跳轉(zhuǎn)函數(shù)的函數(shù)名;
[0050]處理單元,還用于:
[0051]在根據(jù)確定出的均為短跳轉(zhuǎn)函數(shù)的第一跳轉(zhuǎn)函數(shù)和N個(gè)第二跳轉(zhuǎn)函數(shù),生成由第一跳轉(zhuǎn)函數(shù)和N個(gè)第二跳轉(zhuǎn)函數(shù)組成的跳轉(zhuǎn)通道之后,從跳