本申請(qǐng)?zhí)峁┝艘环N程序更新方法和裝置,該方法包括:向處于運(yùn)行狀態(tài)的目標(biāo)程序內(nèi)加載目標(biāo)動(dòng)態(tài)鏈接庫(kù),目標(biāo)程序的代碼為基于C或者C++語(yǔ)言編寫(xiě)的,目標(biāo)動(dòng)態(tài)鏈接庫(kù)包括:至少一個(gè)更新函數(shù),更新函數(shù)為用于更新目標(biāo)程序內(nèi)需要更新的原始函數(shù)的函數(shù);確定更新函數(shù)對(duì)應(yīng)的原始函數(shù)在目標(biāo)程序內(nèi)的第一函數(shù)地址;確定更新函數(shù)在目標(biāo)動(dòng)態(tài)鏈接庫(kù)的第二函數(shù)地址;確定目標(biāo)程序中用于調(diào)用原始函數(shù)的至少一個(gè)調(diào)用函數(shù),將調(diào)用函數(shù)中原始函數(shù)的第一函數(shù)地址替換為原始函數(shù)對(duì)應(yīng)的更新函數(shù)的第二函數(shù)地址,以完成目標(biāo)程序的更新。本申請(qǐng)的方案可以使得基于C或者C++語(yǔ)言開(kāi)發(fā)的程序能夠在運(yùn)行狀態(tài)完成更新,降低了該種程序更新的復(fù)雜度。降低了該種程序更新的復(fù)雜度。降低了該種程序更新的復(fù)雜度。
【技術(shù)實(shí)現(xiàn)步驟摘要】
程序更新方法和裝置
[0001]本申請(qǐng)涉及計(jì)算機(jī)
,尤其涉及一種程序更新方法和裝置。
技術(shù)介紹
[0002]熱更新是指在程序運(yùn)行的過(guò)程中實(shí)現(xiàn)的即時(shí)更新。
[0003]通過(guò)熱更新技術(shù)可以實(shí)現(xiàn)在不退出應(yīng)用程序的前提下,完成應(yīng)用程序的更新,從而提升應(yīng)用程序的用戶使用體驗(yàn)。如,以游戲?yàn)槔?,已開(kāi)發(fā)出的游戲中可能會(huì)存在漏洞或者其他需要修復(fù)的代碼,通過(guò)熱更新技術(shù)可以在無(wú)需游戲玩家下線的前提下,完成游戲的更新,從而不會(huì)影響到游戲玩家的游戲體驗(yàn)。但是,目前采用C或者C++語(yǔ)言開(kāi)發(fā)的程序日益增多,而由于C或者C++語(yǔ)言的特性,對(duì)于采用C或者C++語(yǔ)言開(kāi)發(fā)的程序無(wú)法自動(dòng)完成熱更新的,必須需要退出程序之后才可以實(shí)現(xiàn)程序的更新,這必然導(dǎo)致了基于C或者C++代碼的程序的更新復(fù)雜度較高。
技術(shù)實(shí)現(xiàn)思路
[0004]本申請(qǐng)?zhí)峁┝艘环N程序更新方法和裝置,以使得基于C或者C++語(yǔ)言開(kāi)發(fā)的程序能夠在運(yùn)行狀態(tài)下完成更新,降低了該種程序更新的復(fù)雜度。
[0005]一方面,本申請(qǐng)?zhí)峁┝艘环N程序更新方法,包括:
[0006]向處于運(yùn)行狀態(tài)的目標(biāo)程序內(nèi)加載目標(biāo)動(dòng)態(tài)鏈接庫(kù),所述目標(biāo)程序的代碼為基于C或者C++語(yǔ)言編寫(xiě)的,所述目標(biāo)動(dòng)態(tài)鏈接庫(kù)包括:至少一個(gè)更新函數(shù),所述更新函數(shù)為用于更新所述目標(biāo)程序內(nèi)需要更新的原始函數(shù)的函數(shù);
[0007]確定所述更新函數(shù)對(duì)應(yīng)的原始函數(shù)在所述目標(biāo)程序內(nèi)的第一函數(shù)地址;
[0008]確定所述更新函數(shù)在所述目標(biāo)動(dòng)態(tài)鏈接庫(kù)的第二函數(shù)地址;
[0009]確定所述目標(biāo)程序中用于調(diào)用所述原始函數(shù)的至少一個(gè)調(diào)用函數(shù),將所述調(diào)用函數(shù)中所述原始函數(shù)的第一函數(shù)地址替換為所述原始函數(shù)對(duì)應(yīng)的更新函數(shù)的第二函數(shù)地址,以完成所述目標(biāo)程序的更新。
[0010]在一種可能的實(shí)現(xiàn)方式中,在所述向處于運(yùn)行狀態(tài)的目標(biāo)程序內(nèi)加載目標(biāo)動(dòng)態(tài)鏈接庫(kù)之前,還包括:
[0011]啟動(dòng)目標(biāo)程序,通過(guò)目標(biāo)程序的編譯程序編譯所述目標(biāo)程序,所述編譯程序中包括導(dǎo)出子函數(shù);
[0012]在通過(guò)所述編譯程序編譯所述目標(biāo)程序的過(guò)程中,通過(guò)所述導(dǎo)出子函數(shù)將所述目標(biāo)程序中的函數(shù)的函數(shù)名稱和函數(shù)地址導(dǎo)出到所述目標(biāo)程序的第一導(dǎo)出表空間,所述第一導(dǎo)出表空間內(nèi)的數(shù)據(jù)可供所述目標(biāo)程序之外的其他程序訪問(wèn);
[0013]所述確定所述更新函數(shù)對(duì)應(yīng)的原始函數(shù)在所述目標(biāo)程序內(nèi)的第一函數(shù)地址,包括:
[0014]基于所述更新函數(shù)的函數(shù)名稱,從所述第一導(dǎo)出表空間查詢所述更新函數(shù)對(duì)應(yīng)的原始函數(shù)在所述目標(biāo)程序中的第一函數(shù)地址。
[0015]在又一種可能的實(shí)現(xiàn)方式中,所述目標(biāo)動(dòng)態(tài)鏈接庫(kù)的第二導(dǎo)出表空間內(nèi)存儲(chǔ)有所述目標(biāo)動(dòng)態(tài)鏈接庫(kù)內(nèi)的函數(shù)的函數(shù)名稱以及函數(shù)地址;
[0016]其中,所述第二導(dǎo)出表空間內(nèi)存儲(chǔ)的函數(shù)名稱和函數(shù)地址為編譯所述目標(biāo)動(dòng)態(tài)鏈接庫(kù)時(shí),導(dǎo)入到所述第二導(dǎo)出表空間內(nèi)的;
[0017]所述第二導(dǎo)出表空間內(nèi)的數(shù)據(jù)可供所述目標(biāo)動(dòng)態(tài)鏈接庫(kù)之外的其他程序訪問(wèn)。
[0018]在又一種可能的實(shí)現(xiàn)方式中,所述向處于運(yùn)行狀態(tài)的目標(biāo)程序內(nèi)加載目標(biāo)動(dòng)態(tài)鏈接庫(kù),包括:
[0019]調(diào)用操作系統(tǒng)中的加載函數(shù),通過(guò)所述加載函數(shù)向處于運(yùn)行狀態(tài)的所述目標(biāo)程序內(nèi)加載目標(biāo)動(dòng)態(tài)鏈接庫(kù)。
[0020]在又一種可能的實(shí)現(xiàn)方式中,所述目標(biāo)動(dòng)態(tài)鏈接庫(kù)中還包括:用于實(shí)現(xiàn)程序熱更新的更新執(zhí)行程序的代碼;
[0021]所述方法還包括:
[0022]執(zhí)行所述更新執(zhí)行程序的代碼,以通過(guò)所述更新執(zhí)行程序執(zhí)行確定所述第一函數(shù)地址、第二函數(shù)地址以及完成所述目標(biāo)應(yīng)用程序的更新的操作。
[0023]在又一種可能的實(shí)現(xiàn)方式中,所述向處于運(yùn)行狀態(tài)的目標(biāo)程序內(nèi)加載目標(biāo)動(dòng)態(tài)鏈接庫(kù),包括:
[0024]啟動(dòng)注入程序;
[0025]通過(guò)所述注入程序向處于運(yùn)行狀態(tài)的目標(biāo)程序內(nèi)注入目標(biāo)動(dòng)態(tài)鏈接庫(kù)。
[0026]在又一種可能的實(shí)現(xiàn)方式中,通過(guò)所述注入程序執(zhí)行確定所述第一函數(shù)地址、第二函數(shù)地址,以及將所述調(diào)用函數(shù)中所述原始函數(shù)的第一函數(shù)地址替換為所述原始函數(shù)對(duì)應(yīng)的更新函數(shù)的第二函數(shù)地址的操作。
[0027]在又一種可能的實(shí)現(xiàn)方式中,所述將所述調(diào)用函數(shù)中所述原始函數(shù)的第一函數(shù)地址替換為所述原始函數(shù)對(duì)應(yīng)的更新函數(shù)的第二函數(shù)地址,包括:
[0028]如果所述調(diào)用函數(shù)所需調(diào)用的原始函數(shù)處于被執(zhí)行狀態(tài),等待所述原始函數(shù)執(zhí)行完畢后,將所述調(diào)用函數(shù)中所述原始函數(shù)的第一函數(shù)地址替換為所述原始函數(shù)對(duì)應(yīng)的更新函數(shù)的第二函數(shù)地址;
[0029]如果所述調(diào)用函數(shù)所需調(diào)用的原始函數(shù)未處于執(zhí)行狀態(tài),將所述調(diào)用函數(shù)中所述原始函數(shù)的第一函數(shù)地址替換為所述原始函數(shù)對(duì)應(yīng)的更新函數(shù)的第二函數(shù)地址。
[0030]在又一種可能的實(shí)現(xiàn)方式中,在所述將所述調(diào)用函數(shù)中所述原始函數(shù)的第一函數(shù)地址替換為所述原始函數(shù)對(duì)應(yīng)的更新函數(shù)的第二函數(shù)地址之前,還包括:
[0031]如果檢測(cè)到緩存中存儲(chǔ)有所述目標(biāo)程序的數(shù)據(jù),清空所述緩存中存儲(chǔ)的所述目標(biāo)程序的數(shù)據(jù)。
[0032]又一方面,本申請(qǐng)還提供了一種程序更新裝置,包括:
[0033]庫(kù)加載單元,用于向處于運(yùn)行狀態(tài)的目標(biāo)程序內(nèi)加載目標(biāo)動(dòng)態(tài)鏈接庫(kù),所述目標(biāo)程序的代碼為基于C或者C++語(yǔ)言編寫(xiě)的,所述目標(biāo)動(dòng)態(tài)鏈接庫(kù)包括:至少一個(gè)更新函數(shù),所述更新函數(shù)為用于更新所述目標(biāo)程序內(nèi)需要更新的原始函數(shù)的函數(shù);
[0034]第一地址確定單元,用于確定所述更新函數(shù)對(duì)應(yīng)的原始函數(shù)在所述目標(biāo)程序內(nèi)的第一函數(shù)地址;
[0035]第二地址確定單元,用于確定所述更新函數(shù)在所述目標(biāo)動(dòng)態(tài)鏈接庫(kù)的第二函數(shù)地
址;
[0036]更新替換單元,用于確定所述目標(biāo)程序中用于調(diào)用所述原始函數(shù)的至少一個(gè)調(diào)用函數(shù),將所述調(diào)用函數(shù)中所述原始函數(shù)的第一函數(shù)地址替換為所述原始函數(shù)對(duì)應(yīng)的更新函數(shù)的第二函數(shù)地址,以完成所述目標(biāo)程序的更新。
[0037]由以上可知,在本申請(qǐng)實(shí)施例中,對(duì)于目標(biāo)程序?yàn)椴捎肅或者C++語(yǔ)言開(kāi)發(fā)的程序,本申請(qǐng)可以預(yù)先生成該目標(biāo)程序?qū)?yīng)的目標(biāo)動(dòng)態(tài)鏈接庫(kù),該目標(biāo)動(dòng)態(tài)鏈接庫(kù)中包括:用于更新該目標(biāo)程序內(nèi)待更新的各原始函數(shù)的至少一個(gè)更新函數(shù)。在此基礎(chǔ)上,通過(guò)向處于運(yùn)行狀態(tài)的目標(biāo)程序內(nèi)加載該目標(biāo)動(dòng)態(tài)鏈接庫(kù),將目標(biāo)程序中需要調(diào)用原始函數(shù)的調(diào)用函數(shù)中該原始函數(shù)的函數(shù)地址替換為該目標(biāo)動(dòng)態(tài)鏈接庫(kù)中相應(yīng)更新函數(shù)的函數(shù)地址,便可以實(shí)現(xiàn)利用目標(biāo)動(dòng)態(tài)鏈接庫(kù)中的更新函數(shù)替換目標(biāo)程序中待更新的原始函數(shù),從而可以在目標(biāo)程序處于運(yùn)行狀態(tài)下,完成該目標(biāo)程序的更新,自然也就無(wú)需先中斷目標(biāo)程序的運(yùn)行再重新利用新版本的目標(biāo)程序來(lái)進(jìn)行更新,降低了目標(biāo)程序更新的復(fù)雜度。
附圖說(shuō)明
[0038]為了更清楚地說(shuō)明本申請(qǐng)實(shí)施例中的技術(shù)方案,下面將對(duì)實(shí)施例描述中所需要使用的附圖作簡(jiǎn)單地介紹,顯而易見(jiàn)地,下面描述中的附圖僅僅是本申請(qǐng)的實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來(lái)講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)提供的附圖獲得其他的附圖。
[0039]圖1示出了本申請(qǐng)實(shí)施例提供的程序更新方法的一種流程示意圖;
[0040]本文檔來(lái)自技高網(wǎng)...
【技術(shù)保護(hù)點(diǎn)】
【技術(shù)特征摘要】
1.一種程序更新方法,其特征在于,包括:向處于運(yùn)行狀態(tài)的目標(biāo)程序內(nèi)加載目標(biāo)動(dòng)態(tài)鏈接庫(kù),所述目標(biāo)程序的代碼為基于C或者C++語(yǔ)言編寫(xiě)的,所述目標(biāo)動(dòng)態(tài)鏈接庫(kù)包括:至少一個(gè)更新函數(shù),所述更新函數(shù)為用于更新所述目標(biāo)程序內(nèi)需要更新的原始函數(shù)的函數(shù);確定所述更新函數(shù)對(duì)應(yīng)的原始函數(shù)在所述目標(biāo)程序內(nèi)的第一函數(shù)地址;確定所述更新函數(shù)在所述目標(biāo)動(dòng)態(tài)鏈接庫(kù)的第二函數(shù)地址;確定所述目標(biāo)程序中用于調(diào)用所述原始函數(shù)的至少一個(gè)調(diào)用函數(shù),將所述調(diào)用函數(shù)中所述原始函數(shù)的第一函數(shù)地址替換為所述原始函數(shù)對(duì)應(yīng)的更新函數(shù)的第二函數(shù)地址,以完成所述目標(biāo)程序的更新。2.根據(jù)權(quán)利要求1所述的方法,其特征在于,在所述向處于運(yùn)行狀態(tài)的目標(biāo)程序內(nèi)加載目標(biāo)動(dòng)態(tài)鏈接庫(kù)之前,還包括:?jiǎn)?dòng)目標(biāo)程序,通過(guò)目標(biāo)程序的編譯程序編譯所述目標(biāo)程序,所述編譯程序中包括導(dǎo)出子函數(shù);在通過(guò)所述編譯程序編譯所述目標(biāo)程序的過(guò)程中,通過(guò)所述導(dǎo)出子函數(shù)將所述目標(biāo)程序中的函數(shù)的函數(shù)名稱和函數(shù)地址導(dǎo)出到所述目標(biāo)程序的第一導(dǎo)出表空間,所述第一導(dǎo)出表空間內(nèi)的數(shù)據(jù)可供所述目標(biāo)程序之外的其他程序訪問(wèn);所述確定所述更新函數(shù)對(duì)應(yīng)的原始函數(shù)在所述目標(biāo)程序內(nèi)的第一函數(shù)地址,包括:基于所述更新函數(shù)的函數(shù)名稱,從所述第一導(dǎo)出表空間查詢所述更新函數(shù)對(duì)應(yīng)的原始函數(shù)在所述目標(biāo)程序中的第一函數(shù)地址。3.根據(jù)權(quán)利要求1或2所述的方法,其特征在于,所述目標(biāo)動(dòng)態(tài)鏈接庫(kù)的第二導(dǎo)出表空間內(nèi)存儲(chǔ)有所述目標(biāo)動(dòng)態(tài)鏈接庫(kù)內(nèi)的函數(shù)的函數(shù)名稱以及函數(shù)地址;其中,所述第二導(dǎo)出表空間內(nèi)存儲(chǔ)的函數(shù)名稱和函數(shù)地址為編譯所述目標(biāo)動(dòng)態(tài)鏈接庫(kù)時(shí),導(dǎo)入到所述第二導(dǎo)出表空間內(nèi)的;所述第二導(dǎo)出表空間內(nèi)的數(shù)據(jù)可供所述目標(biāo)動(dòng)態(tài)鏈接庫(kù)之外的其他程序訪問(wèn)。4.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述向處于運(yùn)行狀態(tài)的目標(biāo)程序內(nèi)加載目標(biāo)動(dòng)態(tài)鏈接庫(kù),包括:調(diào)用操作系統(tǒng)中的加載函數(shù),通過(guò)所述加載函數(shù)向處于運(yùn)行狀態(tài)的所述目標(biāo)程序內(nèi)加載目標(biāo)動(dòng)態(tài)鏈接庫(kù)。5.根據(jù)權(quán)利要求4所述的方法,其特征在于,所述目標(biāo)動(dòng)態(tài)鏈接庫(kù)中還包括:用于實(shí)現(xiàn)程序熱更新的更新執(zhí)行程序的代碼;所述方法還包括:執(zhí)行所述更新執(zhí)行程序的代碼,以通過(guò)所述更新...
【專利技術(shù)屬性】
技術(shù)研發(fā)人員:戴鑫,孫雨,侯健,
申請(qǐng)(專利權(quán))人:北京暢游創(chuàng)想軟件技術(shù)有限公司,
類型:發(fā)明
國(guó)別省市:
還沒(méi)有人留言評(píng)論。發(fā)表了對(duì)其他瀏覽者有用的留言會(huì)獲得科技券。