載命令的處理。
[0078]熱補(bǔ)丁加載:對(duì)補(bǔ)丁文件進(jìn)行校驗(yàn),并使用dlopen函數(shù)加載動(dòng)態(tài)鏈接庫(kù)格式的補(bǔ)丁文件到系統(tǒng)中。
[0079]如果沒(méi)有在步驟201中所述的在編譯被補(bǔ)丁程序時(shí)增加-rdynamic編譯選項(xiàng),在步驟204中使用dlopen函數(shù)加載動(dòng)態(tài)鏈接庫(kù)格式的補(bǔ)丁文件就會(huì)報(bào)錯(cuò),報(bào)錯(cuò)示例如下:
[0080]open dll failed!
[0081]error./Iibsub_sourcel_patch.so:undefined symbol:xxx
[0082]該錯(cuò)誤信息為dlopen函數(shù)加載補(bǔ)丁文件時(shí),由于補(bǔ)丁文件使用了被補(bǔ)丁程序里的符號(hào)(例如全局變量或全局函數(shù)),而補(bǔ)丁文件中沒(méi)有對(duì)該符號(hào)進(jìn)行重定位處理。
[0083]如果在步驟201中所述的在編譯被補(bǔ)丁程序時(shí)增加-rdynamic編譯選項(xiàng),則被補(bǔ)丁程序中的所有符號(hào)都添加到了動(dòng)態(tài)符號(hào)表.dynsym中,在步驟204中dlopen函數(shù)可以向后跟蹤到被補(bǔ)丁程序的符號(hào)表.dynsym中的符號(hào),通過(guò)dlopen函數(shù)可以成功加載動(dòng)態(tài)鏈接庫(kù)格式的補(bǔ)丁文件,而這一切都是Linux操作系統(tǒng)的dlopen函數(shù)自動(dòng)完成,不用補(bǔ)丁制作者去實(shí)現(xiàn)補(bǔ)丁文件復(fù)雜的重定位過(guò)程。相比傳統(tǒng)熱補(bǔ)丁方法需要補(bǔ)丁制作者去實(shí)現(xiàn)復(fù)雜的重定位過(guò)程而言,本發(fā)明的熱補(bǔ)丁方法更簡(jiǎn)單并且可靠性更好。
[0084]同時(shí),采用dlopen函數(shù)加載動(dòng)態(tài)鏈接庫(kù)格式的補(bǔ)丁文件到設(shè)備系統(tǒng)中,補(bǔ)丁文件的加載、刪除和存放空間都是由Linux操作系統(tǒng)從全局進(jìn)行規(guī)劃和管理的,無(wú)須為補(bǔ)丁文件預(yù)留補(bǔ)丁內(nèi)存區(qū),也無(wú)須補(bǔ)丁文件加載時(shí)去動(dòng)態(tài)申請(qǐng)內(nèi)存作為補(bǔ)丁區(qū),所以這種方式比傳統(tǒng)熱補(bǔ)丁方法中將熱補(bǔ)丁文件加載到補(bǔ)丁預(yù)留內(nèi)存區(qū)的方式更靈活。
[0085]另外,對(duì)于多核多CPU的應(yīng)用,特別是分布式系統(tǒng)中,運(yùn)行著多個(gè)應(yīng)用程序,這些應(yīng)用程序是相同的但運(yùn)行在不同的CPU上,或者應(yīng)用程序不同但具有相同的缺陷函數(shù),都需要同樣的補(bǔ)丁函數(shù)進(jìn)行修補(bǔ),因?yàn)橹囟ㄎ缓蟛煌膽?yīng)用程序里的符號(hào)地址是不同的,所以傳統(tǒng)的熱補(bǔ)丁方法需要對(duì)每個(gè)應(yīng)用程序都做一個(gè)補(bǔ)丁文件。本發(fā)明所提供的熱補(bǔ)丁方法不用補(bǔ)丁制作者對(duì)補(bǔ)丁文件里的符號(hào)進(jìn)行重定位,可以滿(mǎn)足同一個(gè)補(bǔ)丁文件能夠適用于多個(gè)應(yīng)用程序的場(chǎng)景。
[0086]步驟205至步驟206為熱補(bǔ)丁激活過(guò)程。
[0087I 具體的,在步驟205中,參照?qǐng)D3所示,包括:
[0088]步驟2051、命令行處理:接收由用戶(hù)輸入的補(bǔ)丁激活命令,對(duì)補(bǔ)丁激活命令進(jìn)行參數(shù)檢查,將補(bǔ)丁激活命令用于熱補(bǔ)丁核心管理。
[0089]步驟2052、熱補(bǔ)丁核心管理:調(diào)用相關(guān)接口進(jìn)行補(bǔ)丁激活命令的處理。
[0090]步驟2053、獲取補(bǔ)丁函數(shù)地址和被補(bǔ)丁函數(shù)地址:根據(jù)補(bǔ)丁函數(shù)替換表中讀出的補(bǔ)丁函數(shù)的名字Func_Patch和被補(bǔ)丁函數(shù)的名字Func獲得補(bǔ)丁函數(shù)和被補(bǔ)丁函數(shù)的地址,在本示例中參照?qǐng)D4所示,假設(shè)被補(bǔ)丁函數(shù)Func的地址為0x400cc2,補(bǔ)丁函數(shù)Func_Patch的地址為0x7f32dc。[0091 ] 具體的,在步驟206中,參照?qǐng)D3所示,包括:
[0092]步驟2061、構(gòu)造跳轉(zhuǎn)指令:利用跳轉(zhuǎn)指令操作符JMP(無(wú)條件的轉(zhuǎn)移到指令指定的地址去執(zhí)行從該地址開(kāi)始的命令)構(gòu)造跳轉(zhuǎn)指令以指向補(bǔ)丁函數(shù)Func_Patch的地址0x7f32dc,示例性的參照?qǐng)D4所示(使用Intel x8664位平臺(tái)),構(gòu)造跳轉(zhuǎn)指令為:JMP0x7f32dc,結(jié)合CPU對(duì)該指令的解釋?zhuān)@條跳轉(zhuǎn)指令表示CPU將從0x7f32dc處讀取指令。
[0093]步驟2062、保存被替換的指令:在進(jìn)行指令替換之前,保存被補(bǔ)丁函數(shù)的被替換的指令,當(dāng)不希望補(bǔ)丁函數(shù)起作用時(shí),能夠直接恢復(fù)被補(bǔ)丁函數(shù)的被替換的指令。
[0094]步驟2063、進(jìn)行指令替換:檢查被補(bǔ)丁函數(shù)是否正在被調(diào)用,當(dāng)被補(bǔ)丁函數(shù)沒(méi)有被調(diào)用時(shí),將被補(bǔ)丁函數(shù)Func入口地址0X400cc2處的指令替換為跳轉(zhuǎn)指令JMP 0x7f32dc,完成指令替換。跳轉(zhuǎn)指令替換的時(shí)機(jī)是被補(bǔ)丁函數(shù)未被調(diào)用,這樣可以保證熱補(bǔ)丁激活的安全性和可靠性。
[0095]具體的,在步驟207中,參照?qǐng)D4所示,熱補(bǔ)丁激活后發(fā)揮作用,當(dāng)被補(bǔ)丁程序的主調(diào)函數(shù)調(diào)用被補(bǔ)丁函數(shù)時(shí),在被補(bǔ)丁函數(shù)入口處執(zhí)行跳轉(zhuǎn)指令JMP 0x7f32dc,跳轉(zhuǎn)到補(bǔ)丁函數(shù)繼續(xù)執(zhí)行,從而避免執(zhí)行被補(bǔ)丁函數(shù)中的其他指令,在補(bǔ)丁函數(shù)中的各指令執(zhí)行完成后再回到主調(diào)函數(shù)上下文繼續(xù)執(zhí)行,所以本發(fā)明的熱補(bǔ)丁方法有較好的實(shí)用性,可以實(shí)現(xiàn)不中斷業(yè)務(wù)的情況下對(duì)缺陷程序進(jìn)行修復(fù)。
[0096]可選的,本發(fā)明的實(shí)施例還可以進(jìn)行熱補(bǔ)丁確認(rèn)、熱補(bǔ)丁刪除以及重啟后熱補(bǔ)丁恢復(fù)三個(gè)步驟,這三個(gè)步驟是為了完善熱補(bǔ)丁的功能。
[0097]熱補(bǔ)丁確認(rèn)是確認(rèn)已經(jīng)激活運(yùn)行的熱補(bǔ)丁,使補(bǔ)丁函數(shù)正式生效。臨時(shí)激活補(bǔ)丁函數(shù)即是在激活熱補(bǔ)丁之后沒(méi)有進(jìn)行確認(rèn),熱補(bǔ)丁中的補(bǔ)丁函數(shù)只是臨時(shí)生效,重啟系統(tǒng)后補(bǔ)丁函數(shù)不再生效;永久激活補(bǔ)丁函數(shù)即是在激活熱補(bǔ)丁激活之后進(jìn)行確認(rèn),會(huì)使熱補(bǔ)丁中的補(bǔ)丁函數(shù)正式生效,重啟系統(tǒng)后補(bǔ)丁函數(shù)仍然生效。
[0098]熱補(bǔ)丁刪除是將所有熱補(bǔ)丁徹底從系統(tǒng)中清除,考慮到實(shí)際應(yīng)用場(chǎng)景,用戶(hù)在確認(rèn)不再需要熱補(bǔ)丁的情況下可以執(zhí)行刪除熱補(bǔ)丁操作。
[0099]設(shè)備重啟后熱補(bǔ)丁恢復(fù)是指設(shè)備重啟后恢復(fù)運(yùn)行重啟前的熱補(bǔ)丁,即自動(dòng)重新執(zhí)行熱補(bǔ)丁加載、熱補(bǔ)丁激活、熱補(bǔ)丁確認(rèn)過(guò)程。這樣可以保證熱補(bǔ)丁的易用性,重啟后不用重新安裝熱補(bǔ)丁。
[0100]本發(fā)明的實(shí)施例提供的熱補(bǔ)丁方法,在對(duì)被補(bǔ)丁程序進(jìn)行編譯時(shí)增加動(dòng)態(tài)鏈接編譯選項(xiàng),使被補(bǔ)丁函數(shù)的外部符號(hào)添加到動(dòng)態(tài)符號(hào)表,以使編譯后的外部符號(hào)能夠被動(dòng)態(tài)鏈接庫(kù)重定位,其中被補(bǔ)丁程序包含被補(bǔ)丁函數(shù)和外部符號(hào);通過(guò)動(dòng)態(tài)鏈接庫(kù)方式編譯補(bǔ)丁函數(shù),以使編譯后的補(bǔ)丁函數(shù)能夠重定位外部符號(hào),其中,補(bǔ)丁函數(shù)為對(duì)被補(bǔ)丁函數(shù)進(jìn)行修補(bǔ)的函數(shù);加載補(bǔ)丁函數(shù)并且重定位外部符號(hào);激活補(bǔ)丁函數(shù)并且去激活被補(bǔ)丁函數(shù)。本發(fā)明的實(shí)施例通過(guò)將被補(bǔ)丁程序中的被補(bǔ)丁函數(shù)的外部符號(hào)添加到動(dòng)態(tài)符號(hào)表并且將補(bǔ)丁函數(shù)編譯為動(dòng)態(tài)鏈接庫(kù),利用操作系統(tǒng)中的動(dòng)態(tài)鏈接庫(kù)加載函數(shù)自動(dòng)對(duì)補(bǔ)丁函數(shù)所涉及的外部符號(hào)進(jìn)行重定位,利用操作系統(tǒng)對(duì)動(dòng)態(tài)鏈接庫(kù)的加載、刪除自動(dòng)分配內(nèi)存的特性來(lái)靈活分配內(nèi)存,同時(shí)利用動(dòng)態(tài)鏈接庫(kù)中一份動(dòng)態(tài)鏈接庫(kù)代碼可以被多處使用的優(yōu)勢(shì)來(lái)使一個(gè)補(bǔ)丁文件對(duì)應(yīng)多個(gè)應(yīng)用程序,解決了傳統(tǒng)熱補(bǔ)丁方法需要重定位、分配內(nèi)存不靈活和無(wú)法實(shí)現(xiàn)一個(gè)補(bǔ)丁文件對(duì)應(yīng)多個(gè)應(yīng)用程序的問(wèn)題。
[0101]實(shí)施例3:
[0102]本發(fā)明的實(shí)施例提供了一種熱補(bǔ)丁裝置,用于執(zhí)行圖1中所示的熱補(bǔ)丁方法,參照?qǐng)D5所示,包括:
[0103]編譯單元51,用于在對(duì)被補(bǔ)丁程序進(jìn)行編譯時(shí)增加動(dòng)態(tài)鏈接編譯選項(xiàng),使被補(bǔ)丁函數(shù)的外部符號(hào)添加到動(dòng)態(tài)符號(hào)表,以使編譯后的外部符號(hào)能夠被動(dòng)態(tài)鏈接庫(kù)重定位,其中被補(bǔ)丁程序包含被補(bǔ)丁函數(shù)和外部符號(hào);
[0104]制作單元52,用于通過(guò)動(dòng)態(tài)鏈接庫(kù)方式編譯補(bǔ)丁函數(shù),以使編譯后的補(bǔ)丁函數(shù)能夠重定位外部符號(hào),其中,補(bǔ)丁函數(shù)為對(duì)被補(bǔ)丁函數(shù)進(jìn)行修補(bǔ)的函數(shù);
[0105]加載單元53,用于加載補(bǔ)丁函數(shù)并且重定位外部符號(hào);
[0106]該加載單元53,還用于激活補(bǔ)丁函數(shù)并且去激活被補(bǔ)丁函數(shù)。
[0107]本發(fā)明的實(shí)施例提供的熱補(bǔ)丁裝置,在對(duì)被補(bǔ)丁程序進(jìn)行編譯時(shí)增加動(dòng)態(tài)鏈接編譯選項(xiàng),使被補(bǔ)丁函數(shù)的外部符號(hào)添加到動(dòng)態(tài)符號(hào)表,以使編譯后的外部符號(hào)能夠被動(dòng)態(tài)鏈接庫(kù)重定位,其中被補(bǔ)丁程序包含被補(bǔ)丁函數(shù)和外部符號(hào);通過(guò)動(dòng)態(tài)鏈接庫(kù)方式編譯補(bǔ)丁函數(shù),以使編譯后的補(bǔ)丁函數(shù)能夠重定位外部符號(hào),其中,補(bǔ)丁函數(shù)為對(duì)被補(bǔ)丁函數(shù)進(jìn)行修補(bǔ)的函數(shù);加載補(bǔ)丁函數(shù)并且重定位外部符號(hào);激活補(bǔ)丁函數(shù)并且去激活被補(bǔ)丁函數(shù)。本發(fā)明的實(shí)施例通過(guò)將被補(bǔ)丁程序中的被補(bǔ)丁函數(shù)的外部符號(hào)添加到動(dòng)態(tài)符號(hào)表并且將補(bǔ)丁函數(shù)編譯為動(dòng)態(tài)鏈接庫(kù),利用操作系統(tǒng)中的動(dòng)態(tài)鏈接庫(kù)加載函數(shù)自動(dòng)對(duì)補(bǔ)丁函數(shù)所涉及的外部符號(hào)進(jìn)行重定位,利用操作系統(tǒng)對(duì)動(dòng)態(tài)鏈接庫(kù)的加載、刪除自動(dòng)分配內(nèi)存的特性來(lái)靈活分配內(nèi)存,同時(shí)利用動(dòng)態(tài)鏈接庫(kù)中一份動(dòng)態(tài)鏈接庫(kù)代碼可以被多處使用的優(yōu)勢(shì)來(lái)使一個(gè)補(bǔ)丁文件對(duì)應(yīng)多個(gè)應(yīng)用程序,解決了傳統(tǒng)熱補(bǔ)丁方法需要重定位、分配內(nèi)存不靈活和無(wú)法實(shí)現(xiàn)一個(gè)補(bǔ)丁文件對(duì)應(yīng)多個(gè)應(yīng)用程序的問(wèn)題。
[0108]可選的,制作單元52具體用于配置補(bǔ)丁函數(shù)替換表,結(jié)合補(bǔ)丁函數(shù)生成補(bǔ)丁目標(biāo)源文件,其中,補(bǔ)丁函數(shù)替換表包含補(bǔ)丁函數(shù)與被補(bǔ)丁函數(shù)的對(duì)應(yīng)關(guān)系;對(duì)補(bǔ)丁目標(biāo)源文件進(jìn)行編譯以生成動(dòng)態(tài)鏈接庫(kù)格式的補(bǔ)丁文件。
[0109]參照?qǐng)D6所示,制作單元52包括: