專利名稱:插入代碼的方法、裝置及存儲(chǔ)介質(zhì)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種計(jì)算機(jī)技術(shù)領(lǐng)域,尤其涉及一種插入代碼的方法、裝置及存儲(chǔ)介質(zhì)。
背景技術(shù):
目前,業(yè)界開發(fā)了許多二進(jìn)制插入工具,利用這些工具可以在應(yīng)用程序的二進(jìn)制代碼中插入需要的代碼,插入的代碼可以把應(yīng)用程序運(yùn)行時(shí)相關(guān)的信息記錄下來,如各個(gè)函數(shù)運(yùn)行的次數(shù),運(yùn)行時(shí)間,以及程序運(yùn)行的軌跡,所訪問操作數(shù)的地址等,而且能夠做到插入這些代碼后不影響原有應(yīng)用程序的功能。而通過插入代碼記錄的信息可以實(shí)現(xiàn)應(yīng)用程序性能的優(yōu)化,預(yù)估應(yīng)用程序在不同處理器的性能。目前業(yè)界最流行使用的對(duì)應(yīng)用程序進(jìn)行動(dòng)態(tài)插入的二進(jìn)制插入工具是動(dòng)態(tài)指令插入Dyninst,它能夠屏蔽不同操作系統(tǒng)和處理器之間的差異,向用戶提供一個(gè)統(tǒng)一插入接口,實(shí)現(xiàn)跨平臺(tái)支持,且可以在應(yīng)用程序運(yùn)行過程中動(dòng)態(tài)插入,現(xiàn)有技術(shù)Dyninst的基本框架包含兩部分,一部分是裝在主機(jī)一側(cè)的控制器Mutator,通過它提供的用戶接口,告訴在應(yīng)用程序的什么位置插入代碼;另外一部分除包含原有的應(yīng)用程序外,還包含插入代碼控制片Sneppets,已經(jīng)支持Dyninst API的實(shí)時(shí)運(yùn)行庫Run-time Library,圖1是現(xiàn)有技術(shù)Dyninst的插入代碼原理圖,如圖1所示,B表示要插入代碼時(shí)所需要額外增加的代碼,在應(yīng)用程序二進(jìn)制中插入代碼大致包含以下幾個(gè)主要步驟 1、將原有應(yīng)用程序Program需要插入代碼位置處的一條指令移出到BaseTramp中,在該位置重新放置一條分支指令,讓其指向Base Tramp; 2、Base Tramp調(diào)用Mini-Tramp,Mini-Tramp負(fù)責(zé)寄存器保存、調(diào)用插入的代碼、恢復(fù)寄存器等; 3、Mini-Tramp執(zhí)行完成后,返回到Base Tramp,執(zhí)行第一步插入分支指令時(shí)移出到Base Tramp指令,即圖中的Relocated Instrcution,最后返回原有應(yīng)用程序。
用反匯編工具,由二進(jìn)制的代碼得到的匯編代碼,稱為反匯編結(jié)果。此現(xiàn)有技術(shù)插入法只能放在原有應(yīng)用程序二進(jìn)制代碼的最后面,不能在反匯編結(jié)果中的任意位置插入需要的代碼。
發(fā)明內(nèi)容
本發(fā)明實(shí)施例提供一種插入代碼的方法、裝置及存儲(chǔ)介質(zhì),以實(shí)現(xiàn)在反匯編結(jié)果中的任意位置插入需要的代碼。
為解決上述技術(shù)問題,本發(fā)明實(shí)施例提供一種插入代碼的方法,包括 編譯鏈接原應(yīng)用程序生成帶有重定位信息的目標(biāo)文件,并反匯編所述原應(yīng)用程序的可執(zhí)行目標(biāo)文件得到反匯編結(jié)果; 解析所述帶有重定位信息的目標(biāo)文件,獲取反匯編結(jié)果中引用指令位置相關(guān)信息的重定位項(xiàng)信息; 根據(jù)所述重定位項(xiàng)信息,用匯編偽指令替換所述反匯編結(jié)果中的匯編指令; 對(duì)所述替換結(jié)果進(jìn)行聲明處理,獲取匯編文件; 在所述匯編文件的任意位置插入代碼。
本發(fā)明實(shí)施例還提供了一種插入代碼的裝置,包括 生成單元,用于編譯鏈接原應(yīng)用程序生成帶有重定位信息的目標(biāo)文件,并反匯編所述原應(yīng)用程序的可執(zhí)行目標(biāo)文件得到反匯編結(jié)果; 解析單元,用于解析所述帶有重定位信息的目標(biāo)文件,獲取反匯編結(jié)果中引用指令位置相關(guān)信息的重定位項(xiàng)信息; 指令替換單元,用于根據(jù)所述重定位項(xiàng)信息,用匯編偽指令替換所述反匯編結(jié)果中的匯編指令,并對(duì)替換結(jié)果進(jìn)行聲明處理,獲取匯編文件; 代碼插入單元,在所述匯編文件的任意位置插入代碼。
本發(fā)明實(shí)施例還提供一種存儲(chǔ)介質(zhì),用于控制計(jì)算機(jī)設(shè)備執(zhí)行插入代碼的方法,所述方法包括以下步驟 編譯鏈接原應(yīng)用程序生成帶有重定位信息的目標(biāo)文件,并反匯編所述原應(yīng)用程序的可執(zhí)行目標(biāo)文件得到反匯編結(jié)果;解析所述帶有重定位信息的目標(biāo)文件,獲取反匯編結(jié)果中引用指令位置相關(guān)信息的重定位項(xiàng)信息; 根據(jù)所述重定位項(xiàng)信息,用匯編偽指令替換所述反匯編結(jié)果中的匯編指令; 對(duì)所述替換結(jié)果進(jìn)行聲明處理,獲取匯編文件; 在所述匯編文件的任意位置插入代碼。
本發(fā)明實(shí)施例對(duì)反匯編結(jié)果代碼段匯編指令用匯編偽指令替換,有利于在反匯編結(jié)果中的任意位置插入需要的代碼。
圖1是現(xiàn)有技術(shù)Dyninst的插入原理圖; 圖2是本發(fā)明實(shí)施例一插入代碼的方法流程示意圖; 圖3是本發(fā)明實(shí)施例在插入代碼后超出條件分支指令范圍后處理流程示意圖; 圖4是本發(fā)明實(shí)施例中帶有重定位信息的目標(biāo)文件B.elf組成示意圖; 圖5是本發(fā)明實(shí)施例二插入代碼的裝置組成示意圖; 圖6是本發(fā)明實(shí)施例二插入代碼的裝置中超出指令范圍處理單元組成示意圖。
具體實(shí)施例方式 為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合附圖對(duì)本發(fā)明作進(jìn)一步地詳細(xì)描述。
圖2是本發(fā)明實(shí)施例一插入代碼的方法流程示意圖,包括具體步驟 A1、編譯鏈接原應(yīng)用程序生成帶有重定位信息的目標(biāo)文件,并反匯編所述原應(yīng)用程序的可執(zhí)行目標(biāo)文件得到反匯編結(jié)果;此處,鏈接原應(yīng)用程序時(shí),在原應(yīng)用程序的任意位置預(yù)留空間,以便于容納插入代碼后增大的代碼段。
A2、解析所述帶有重定位信息的目標(biāo)文件,獲取反匯編結(jié)果中引用指令位置相關(guān)信息的重定位項(xiàng)信息; A3、根據(jù)所述重定位項(xiàng)信息,用匯編偽指令替換所述反匯編結(jié)果中的匯編指令; A4、對(duì)所述替換結(jié)果進(jìn)行聲明處理,獲取匯編文件; 此處,根據(jù)重定位項(xiàng)信息提供代碼段偏移量信息,得到反匯編結(jié)果中的匯編指令;基于所述重定位項(xiàng)信息中的重定位類型、符號(hào)名,用匯編偽指令替換所述匯編指令。
A5、在所述匯編文件的任意位置插入代碼。
此處,在匯編文件中插入需要的代碼,用于記錄各個(gè)函數(shù)的運(yùn)行次數(shù),程序運(yùn)行的軌跡以及程序運(yùn)行時(shí)訪問操作數(shù)的地址等。
由于是將代碼插入到所述反匯編結(jié)果中,有時(shí)會(huì)出現(xiàn)插入代碼后超出條件分支指令范圍,圖3是本發(fā)明實(shí)施例在插入代碼后超出條件分支指令范圍后處理流程示意圖,包括具體步驟 B1、接收插入代碼后超出條件分支指令范圍的告警信息,確定發(fā)出告警信息的指令; B2、設(shè)置標(biāo)簽,并將目標(biāo)位置信息賦值給所述標(biāo)簽;此處,在不改變?cè)瓍R編程序邏輯的情況下,設(shè)置標(biāo)簽,對(duì)程序進(jìn)行一定的修改。
B3、根據(jù)所述標(biāo)簽的值,跳轉(zhuǎn)到所述標(biāo)簽所指的位置。
根據(jù)上述步驟在插入代碼后超出條件分支指令范圍時(shí),可以在不改變?cè)绦虻倪\(yùn)行邏輯,解決插入代碼后超出條件分支的編碼范圍的問題。
在上述匯編文件插入代碼的步驟之后還包括編譯、鏈接插入代碼的匯編文件,根據(jù)生成的MAP文件中函數(shù)位置信息,以及重定位項(xiàng)信息,對(duì)數(shù)據(jù)段中引用函數(shù)位置相關(guān)的內(nèi)容進(jìn)行更新。
下面通過一個(gè)具體的例子對(duì)上述相關(guān)方法進(jìn)行詳細(xì)描述 編譯鏈接原應(yīng)用程序生成帶有重定位信息的目標(biāo)文件,在鏈接原應(yīng)用程序時(shí),在原應(yīng)用程序的任意位置預(yù)留空間,代碼段中預(yù)留空間的鏈接腳本如下,本實(shí)施例中以預(yù)留4M空間為例 .text 0x200000 { *(.text)(此處表示放置應(yīng)用程序的有效的指令) .=ALIGN(0x 100); .=.+0x400000;(此處表示在有效的指令后面預(yù)留4M大小的空間) }=0x1234 上述所提及具體的代碼信息僅為舉例,此步鏈接出的應(yīng)用程序的可執(zhí)行目標(biāo)文件在此處取名為A.elf;編譯鏈接原應(yīng)用程序生成帶有重定位信息的目標(biāo)文件具體步驟是,利用通用的編譯、鏈接器,所有編譯、鏈接選項(xiàng)不變,在鏈接時(shí)增加參數(shù)-r選項(xiàng),-r選項(xiàng)是鏈接器(一個(gè)應(yīng)用程序)的輸入?yún)?shù),生成帶有重定位信息的目標(biāo)文件在此處取名B.elf,通過-r參數(shù),告訴鏈接器輸出的是一個(gè)帶有重定位信息的目標(biāo)文件。
用反匯編工具對(duì)可執(zhí)行的目標(biāo)文件,在此處是對(duì)例如A.elf的代碼段進(jìn)行反匯編,得到反匯編結(jié)果。解析所述帶有重定位信息的目標(biāo)文件,獲取反匯編結(jié)果中引用指令位置相關(guān)信息的重定位項(xiàng)信息;解析所述帶有重定位信息的目標(biāo)文件,該處是對(duì)例如B.elf進(jìn)行解析,圖4是本發(fā)明實(shí)施例中可定重位的目標(biāo)文件B.elf組成示意圖,通過解析帶有重定位信息文件例如B.elf的代碼段重定項(xiàng)如(.rel.text)發(fā)現(xiàn),在例如代碼段偏移量(r_offset)為0x3412、0x3416有兩處引用了代碼位置相關(guān)的指令,重定位類型例如(r_type)分別為4、6,引用的符號(hào)名例如(st_name)為ether_ouput,即有兩條指令分別取ether_ouput的高位地址與低位地址 r_ottset r_type st_into st_shndx st_value st_name 34126 12 1 3b2b90 ether_output 34164 12 1 3b2b90 ether_output …… 此處,根據(jù)重定位信息提供代碼段偏移量信息,得到反匯編結(jié)果中的匯編指令,所述匯編指令如下 00203410<feiattach+2d8>lisr8,91 00203414<feiattach+2dc>addir8,r8,11152 根據(jù)重定位類型、符號(hào)名,用匯編偽指令例如ether_output@ha、ether_output@1對(duì)所述匯編指令的91、11152進(jìn)行替代; 00203410<feiattach+2d8>lis r8,ether_output@ha 00203414<feiattach+2dc>addi r8,r8,ether_outpu@1 上述所提及具體的匯編指令、匯編偽指令等均僅為舉例,在大多數(shù)情況下,用反匯編工具得到的反匯編結(jié)果并不是一個(gè)可編譯、可鏈接的匯編文件,將反匯編結(jié)果處理成一個(gè)可編譯、可鏈接的匯編文件主要需要進(jìn)行如下兩方面的處理在所述替換結(jié)果中的函數(shù)的第一條指令前面用偽指令進(jìn)行聲明;或?qū)Ψ种е噶钪杏玫降奶D(zhuǎn)標(biāo)簽進(jìn)行聲明。下面以一個(gè)具體的例子說明聲明處理。
(1)在反匯編結(jié)果中,在函數(shù)的第一條指令前面需要用偽指令進(jìn)行聲明,以便編譯、鏈接時(shí)能夠產(chǎn)生各個(gè)函數(shù)的位置信息,如反匯編結(jié)果如下,002b5250<CDBCloseCursor>stwu r1,-16(r1)則需要在所述002b5250<CDBCloseCursor>stwu r1,-16(r1)指令的前面用偽指令進(jìn)行聲明,表示這是一個(gè)函數(shù)。聲明如下 .glob1CDBCloseCursor .type CDBCloseCursor,@function CDBCloseCursor: stwur1,-16(r1) (2)分支指令用到的跳轉(zhuǎn)標(biāo)簽需要進(jìn)行聲明,如反匯編有下面的結(jié)果002b527c<CDBCloseCursor+2c>beq 002b5298<CDBCloseCursor+48>則需要對(duì)代碼位置為002b5298的標(biāo)簽CDBCloseCursor+48進(jìn)行聲明,聲明如下CDBCloseCursor+48 lis r3,1 上述所提及具體的匯編偽指令為舉例,在所述匯編文件插入代碼,對(duì)插入代碼后的匯編文件進(jìn)行編譯、鏈接,得到目標(biāo)文件C.elf,由于是將要插入的代碼直接插在原應(yīng)用程序中,這樣在有大量代碼插入的情況下,可能會(huì)導(dǎo)致插入代碼后超出原條件分支允許的編碼范圍。接收插入代碼后超出條件分支指令范圍的告警信息,確定發(fā)出告警信息的指令,所述告警信息是編譯工具產(chǎn)生的,自動(dòng)分析哪個(gè)地方有告警,并進(jìn)行修改。操作人員可以通過計(jì)算機(jī)顯示器了解所述告警信息,例如所述告警信息在計(jì)算機(jī)上顯示為 C:\TMP\cca43967.s:858425:Warning:operand out of range(48728not between-32768and 32767) 原匯編文件 …… sth 11,168(1) beq Tnu_DbgSet_71fc_003ff2a0 上述表示此處編譯時(shí)提示有告警的指令,即目標(biāo)位置超出了分支指令所允許的編碼范圍。
mflr 16 blbsp_SaveReg …… 上述所提及具體匯編指令、匯編偽指令等均僅為舉例,根據(jù)編譯時(shí)提供的告警信息,確定匯編文件哪條指令出了問題。設(shè)置標(biāo)簽,并將目標(biāo)位置信息賦值給所述標(biāo)簽,在不改變?cè)瓍R編程序邏輯的情況下,對(duì)程序進(jìn)行一定的修改,增加兩個(gè)標(biāo)簽tmp1、tmp2,tmp1中內(nèi)容為b Tnu_DbgSet_71fc_003ff2a0,表示無條件跳轉(zhuǎn)到目標(biāo)位置,tmp2內(nèi)容為原條件分支后面的指令;修改原分支指令的目標(biāo)位置為tmp1,并在其后放一條無條件分支指令,目標(biāo)位置為tmp2,如下所示 …… sth 11,168(1) beq tmp1 b tmp2 tmp1: b Tnu_DbgSet_71fc_003ff2a0 tmp2: mflr 16 b1 bsp_SaveReg …… 上述所提及具體的匯編指令為舉例,根據(jù)所述標(biāo)簽的值,跳轉(zhuǎn)到所述標(biāo)簽所指的位置。
編譯、鏈接插入代碼的匯編文件,根據(jù)生成的MAP文件中函數(shù)位置信息,以及重定位項(xiàng)信息,對(duì)數(shù)據(jù)段中引用函數(shù)位置相關(guān)的內(nèi)容進(jìn)行更新。根據(jù)匯編文件編譯、鏈接產(chǎn)生的MAP文件提供的函數(shù)位置信息,以及對(duì)重定位文件數(shù)據(jù)段重定位項(xiàng)(.rel.data)解析出重定位信息,對(duì)A.elf數(shù)據(jù)段中引用函數(shù)位置相關(guān)的地方進(jìn)行更新;用C.elf文件的代碼段覆蓋A.elf的代碼段,得到插入代碼后的應(yīng)用程序目標(biāo)文件D.elf。
應(yīng)當(dāng)理解的是,上述實(shí)施例中,所提及具體的代碼信息、匯編指令、匯編偽指令等均僅為舉例,還可以采用其他代碼信息、匯編指令、匯編偽指令等來實(shí)施本發(fā)明的實(shí)施例。
下面對(duì)與上述方法實(shí)施例插入代碼處理裝置進(jìn)行詳細(xì)說明。
圖5是本發(fā)明實(shí)施例二插入代碼的裝置組成示意圖,如圖5所示,所述插入代碼處理裝置包括 生成單元1,用于編譯鏈接原應(yīng)用程序生成帶有重定位信息的目標(biāo)文件,并反匯編所述原應(yīng)用程序的可執(zhí)行目標(biāo)文件得到反匯編結(jié)果; 此處,在原應(yīng)用程序的任意位置預(yù)留空間,以便于容納插入代碼后增大的代碼段。生成單元1鏈接原應(yīng)用程序生成帶有重定位信息的目標(biāo)文件具體過程是所有編譯、鏈接選項(xiàng)不變,在鏈接時(shí)增加參數(shù)-r選項(xiàng),-r選項(xiàng)是鏈接器(一個(gè)應(yīng)用程序)的輸入?yún)?shù),生成帶有重定位信息的目標(biāo)文件B.elf,通過-r參數(shù),告訴鏈接器輸出的是一個(gè)帶有重定位信息的目標(biāo)文件。反匯編所述原應(yīng)用程序的可執(zhí)行目標(biāo)文件得到反匯編結(jié)果。
解析單元2,用于解析所述帶有重定位信息的目標(biāo)文件,獲取反匯編結(jié)果中引用指令位置相關(guān)信息的重定位項(xiàng)信息; 指令替換單元3,用于根據(jù)所述重定位項(xiàng)信息,用匯編偽指令替換所述反匯編結(jié)果中的匯編指令,并對(duì)替換結(jié)果進(jìn)行聲明處理,獲取匯編文件; 此處,所述指令替換單元3包括指令替換執(zhí)行單元31,用于根據(jù)所述反匯編結(jié)果中代碼段的偏移量信息,獲取所述反匯編結(jié)果中代碼段的匯編指令,基于所述重定位項(xiàng)信息中的重定位類型、符號(hào)名,用匯編偽指令替代所述匯編指令。
代碼插入單元4,在所述匯編文件的任意位置插入代碼。
所述插入代碼處理裝置還包括 數(shù)據(jù)更新單元5,用于在編譯、鏈接插入代碼的匯編文件后,根據(jù)生成的MAP文件中函數(shù)位置信息,以及重定位項(xiàng)信息,對(duì)數(shù)據(jù)段中引用函數(shù)位置相關(guān)的內(nèi)容進(jìn)行更新。
超出指令范圍處理單元6,用于處理插入代碼后超出條件分支指令范圍的指令。所述超出指令范圍處理單元6包括 告警信息接收單元61,用于接收插入代碼后超出條件分支指令范圍的告警信息,確定發(fā)出告警信息的指令; 設(shè)置標(biāo)簽單元62,用于將目標(biāo)位置信息賦值給所述標(biāo)簽; 跳轉(zhuǎn)單元63,用于根據(jù)所述設(shè)置標(biāo)簽單元中所述標(biāo)簽的值跳轉(zhuǎn)到所述標(biāo)簽所指的位置,設(shè)置無條件跳轉(zhuǎn)到所述標(biāo)簽所指的位置的無條件跳轉(zhuǎn)標(biāo)簽,將原分支指令的目標(biāo)位置設(shè)置為所述無條件跳轉(zhuǎn)標(biāo)簽所指的位置,設(shè)置跳轉(zhuǎn)到原條件分支后面的指令所指位置的標(biāo)簽,將其放在所述無條件跳轉(zhuǎn)標(biāo)簽后面。
通過以上的實(shí)施方式的描述,本領(lǐng)域的技術(shù)人員可以清楚地了解到本發(fā)明可以通過硬件或借助軟件加必需的通用硬件平臺(tái)的方式來實(shí)現(xiàn),基于這樣的理解,本發(fā)明的技術(shù)方案本質(zhì)上或者說對(duì)現(xiàn)有技術(shù)做出貢獻(xiàn)的部分也可以軟件產(chǎn)品的形式體現(xiàn)出來,該計(jì)算機(jī)軟件產(chǎn)品存儲(chǔ)在一個(gè)存儲(chǔ)介質(zhì)中,包括若干指令用以使得一臺(tái)計(jì)算機(jī)設(shè)備(可以是個(gè)人計(jì)算機(jī),服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本發(fā)明各個(gè)實(shí)施例的方法。該方法包括以下步驟 編譯鏈接原應(yīng)用程序生成帶有重定位信息的目標(biāo)文件,并反匯編所述原應(yīng)用程序的可執(zhí)行目標(biāo)文件得到反匯編結(jié)果; 解析所述帶有重定位信息的目標(biāo)文件,獲取反匯編結(jié)果中引用指令位置相關(guān)信息的重定位項(xiàng)信息; 根據(jù)所述重定位項(xiàng)信息,用匯編偽指令替換所述反匯編結(jié)果中的匯編指令; 對(duì)所述替換結(jié)果進(jìn)行聲明處理,獲取匯編文件; 在所述匯編文件的任意位置插入代碼。
本發(fā)明實(shí)施例對(duì)反匯編結(jié)果代碼段匯編指令用匯編偽指令替換,有利于在反匯編結(jié)果中插入需要的代碼。由于在鏈接原應(yīng)用程序時(shí),在原有應(yīng)用程序的任意位置預(yù)留空間,可以直接將要插入的代碼放在原應(yīng)用程序的中間,減少了分支指令,并且不改變?cè)瓚?yīng)用程序的運(yùn)行軌跡,降低了插入代碼所增加的開銷,保證了在即使有大量代碼插入的情況下原有應(yīng)用程序運(yùn)行的正確性,并且可應(yīng)用在多種處理器支持的反匯編工具。
以上所揭露的僅為本發(fā)明較佳實(shí)施例而已,當(dāng)然不能以此來限定本發(fā)明之權(quán)利范圍,因此依本發(fā)明權(quán)利要求所作的等同變化,仍屬本發(fā)明所涵蓋的范圍。
權(quán)利要求
1、一種插入代碼的方法,其特征在于,包括
編譯鏈接原應(yīng)用程序生成帶有重定位信息的目標(biāo)文件,并反匯編所述原應(yīng)用程序的可執(zhí)行目標(biāo)文件得到反匯編結(jié)果;
解析所述帶有重定位信息的目標(biāo)文件,獲取反匯編結(jié)果中引用指令位置相關(guān)信息的重定位項(xiàng)信息;
根據(jù)所述重定位項(xiàng)信息,用匯編偽指令替換所述反匯編結(jié)果中的匯編指令;
對(duì)所述替換結(jié)果進(jìn)行聲明處理,獲取匯編文件;
在所述匯編文件的任意位置插入代碼。
2、如權(quán)利要求1所述的方法,其特征在于,所述生成帶有重定位信息的目標(biāo)文件具體是指
在鏈接時(shí)加入重定位參數(shù)選項(xiàng),編譯鏈接,生成帶有重定位信息的目標(biāo)文件。
3、如權(quán)利要求1所述的方法,其特征在于,所述替換步驟具體
根據(jù)所述反匯編結(jié)果中代碼段的偏移量信息,獲取所述反匯編結(jié)果中代碼段的匯編指令,基于所述重定位項(xiàng)信息中的重定位類型、符號(hào)名,用匯編偽指令替代所述匯編指令。
4、如權(quán)利要求1所述的方法,其特征在于,在所述匯編文件任意位置插入代碼之后,還包括
編譯、鏈接插入代碼的匯編文件,根據(jù)生成的MAP文件中函數(shù)位置信息,以及重定位項(xiàng)信息,對(duì)數(shù)據(jù)段中引用函數(shù)位置相關(guān)的內(nèi)容進(jìn)行更新。
5、如權(quán)利要求1所述的方法,其特征在于,還包括在所述編譯鏈接的原應(yīng)用程序任意位置預(yù)留空間。
6、如權(quán)利要求1所述的方法,其特征在于,所述聲明步驟具體包括
在所述替換結(jié)果中的函數(shù)的第一條指令前面用偽指令進(jìn)行聲明;或
對(duì)分支指令中用到的跳轉(zhuǎn)標(biāo)簽進(jìn)行聲明。
7、如權(quán)利要求1所述的方法,其特征在于,在所述匯編文件插入代碼之后,如果在插入代碼后超出條件分支指令范圍,還包括
接收插入代碼后超出條件分支指令范圍的告警信息,確定發(fā)出告警信息的指令;
設(shè)置標(biāo)簽,并將目標(biāo)位置信息賦值給所述標(biāo)簽;
根據(jù)所述標(biāo)簽的值,跳轉(zhuǎn)到所述標(biāo)簽所指的位置。
8、如權(quán)利要求7所述的方法,其特征在于,所述設(shè)置標(biāo)簽步驟具體包括
設(shè)置無條件跳轉(zhuǎn)到所述標(biāo)簽所指的位置的無條件跳轉(zhuǎn)標(biāo)簽,將原分支指令的目標(biāo)位置設(shè)置為所述無條件跳轉(zhuǎn)標(biāo)簽所指的位置;
設(shè)置跳轉(zhuǎn)到原條件分支后面的指令所指位置的標(biāo)簽,將其放在所述無條件跳轉(zhuǎn)標(biāo)簽后面。
9、一種插入代碼的裝置,其特征在于,包括
生成單元,用于編譯鏈接原應(yīng)用程序生成帶有重定位信息的目標(biāo)文件,并反匯編所述原應(yīng)用程序的可執(zhí)行目標(biāo)文件得到反匯編結(jié)果;
解析單元,用于解析所述帶有重定位信息的目標(biāo)文件,獲取反匯編結(jié)果中引用指令位置相關(guān)信息的重定位項(xiàng)信息;
指令替換單元,用于根據(jù)所述重定位項(xiàng)信息,用匯編偽指令替換所述反匯編結(jié)果中的匯編指令,并對(duì)替換結(jié)果進(jìn)行聲明處理,獲取匯編文件;
代碼插入單元,在所述匯編文件的任意位置插入代碼。
10、如權(quán)利要求9所述的裝置,其特征在于,所述指令替換單元包括
指令替換執(zhí)行單元,用于根據(jù)所述反匯編結(jié)果中代碼段的偏移量信息,獲取所述反匯編結(jié)果中代碼段的匯編指令,基于重定位類型、符號(hào)名,用匯編偽指令替代所述匯編指令。
11、如權(quán)利要求10所述的裝置,其特征在于,還包括
數(shù)據(jù)更新單元,用于在編譯、鏈接插入代碼的匯編文件后,根據(jù)生成的MAP文件中函數(shù)位置信息,以及重定位項(xiàng)信息,對(duì)數(shù)據(jù)段中引用函數(shù)位置相關(guān)的內(nèi)容進(jìn)行更新。
12、如權(quán)利要求9所述的裝置,其特征在于,還包括,
超出指令范圍處理單元,用于處理插入代碼后超出條件分支指令范圍的指令。
13、如權(quán)利要求12所述的裝置,其特征在于,所述超出指令范圍處理單元包括
告警信息接收單元,用于接收插入代碼后超出條件分支指令范圍的告警信息,確定發(fā)出告警信息的指令;
設(shè)置標(biāo)簽單元,用于將目標(biāo)位置信息賦值給所述標(biāo)簽;
跳轉(zhuǎn)單元,用于根據(jù)所述設(shè)置標(biāo)簽單元中所述標(biāo)簽的值跳轉(zhuǎn)到所述標(biāo)簽所指的位置,設(shè)置無條件跳轉(zhuǎn)到所述標(biāo)簽所指的位置的無條件跳轉(zhuǎn)標(biāo)簽,將原分支指令的目標(biāo)位置設(shè)置為所述無條件跳轉(zhuǎn)標(biāo)簽所指的位置,設(shè)置跳轉(zhuǎn)到原條件分支后面的指令所指位置的標(biāo)簽,將其放在所述無條件跳轉(zhuǎn)標(biāo)簽后面。
14、一種存儲(chǔ)介質(zhì),用于控制計(jì)算機(jī)設(shè)備執(zhí)行插入代碼的方法,所述方法包括以下步驟
編譯鏈接原應(yīng)用程序生成帶有重定位信息的目標(biāo)文件,并反匯編所述原應(yīng)用程序的可執(zhí)行目標(biāo)文件得到反匯編結(jié)果;
解析所述帶有重定位信息的目標(biāo)文件,獲取反匯編結(jié)果中引用指令位置相關(guān)信息的重定位項(xiàng)信息;
根據(jù)所述重定位項(xiàng)信息,用匯編偽指令替換所述反匯編結(jié)果中的匯編指令;
對(duì)所述替換結(jié)果進(jìn)行聲明處理,獲取匯編文件;
在所述匯編文件的任意位置插入代碼。
全文摘要
本發(fā)明公開了一種插入代碼的方法,包括編譯鏈接原應(yīng)用程序生成帶有重定位信息的目標(biāo)文件,并反匯編所述原應(yīng)用程序的可執(zhí)行目標(biāo)文件得到反匯編結(jié)果,解析所述帶有重定位信息的目標(biāo)文件,獲取反匯編結(jié)果中引用指令位置相關(guān)信息的重定位項(xiàng)信息,根據(jù)所述重定位項(xiàng)信息,用匯編偽指令替換所述反匯編結(jié)果中的匯編指令,對(duì)替換結(jié)果進(jìn)行聲明處理,獲取匯編文件,在所述匯編文件的任意位置插入代碼。本發(fā)明還公開了一種插入代碼的裝置及存儲(chǔ)介質(zhì)。本發(fā)明實(shí)施例對(duì)反匯編結(jié)果代碼段匯編指令用匯編偽指令替換,有利于在反匯編結(jié)果中的任意位置插入需要的代碼。
文檔編號(hào)G06F9/45GK101266549SQ20081002688
公開日2008年9月17日 申請(qǐng)日期2008年3月19日 優(yōu)先權(quán)日2008年3月19日
發(fā)明者雄 張 申請(qǐng)人:華為技術(shù)有限公司