專利名稱:一種獲取程序中模塊間函數(shù)接口的方法和系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及大型軟件的模塊接口技術(shù),尤其涉及一種獲取程序中模塊間函數(shù)接口 的方法和系統(tǒng)。
背景技術(shù):
隨著計(jì)算機(jī)技術(shù)和通信技術(shù)的不斷發(fā)展,用戶對(duì)軟件系統(tǒng)的性能要求也越來越 高,軟件系統(tǒng)也變得越來越大,進(jìn)而在現(xiàn)有技術(shù)中,產(chǎn)生了很多大型軟件系統(tǒng)。
在大型軟件系統(tǒng)中,程序里包含了若干邏輯模塊之間的相互作用,而這些邏輯模 塊之間的接口,會(huì)直接影響模塊的程序架構(gòu)中的模塊耦合關(guān)系,對(duì)軟件系統(tǒng)的綜合性能影 響很大。
邏輯模塊之間的接口除了在系統(tǒng)架構(gòu)設(shè)計(jì)時(shí)考慮以外,還需要在后續(xù)的詳細(xì)設(shè) 計(jì)、編碼實(shí)現(xiàn)中嚴(yán)格遵循接口說明書。因此,需要一種有效的手段,可以檢查已實(shí)現(xiàn)的軟件 系統(tǒng)中,模塊的實(shí)際接口情況,以便與接口設(shè)計(jì)進(jìn)行對(duì)比,在發(fā)現(xiàn)接口差異可以進(jìn)行及時(shí)修 改。
同時(shí),在對(duì)舊的軟件系統(tǒng)架構(gòu)改造中,還需要對(duì)現(xiàn)有程序中的模塊接口關(guān)系進(jìn)行 提取,然后在此基礎(chǔ)上進(jìn)行模塊解耦,設(shè)計(jì)新的模塊接口。而這也需要獲取模塊接口。
程序模塊之間的接口,包括函數(shù)接口與數(shù)據(jù)接口。對(duì)于函數(shù)接口,程序里的函數(shù) 調(diào)用關(guān)系有兩類,分別是內(nèi)部函數(shù)調(diào)用IFC(Internal Function Calling)、外部函數(shù)調(diào)用 EFC (External Function Calling)。其中IFC的函數(shù)調(diào)用點(diǎn)和被調(diào)用函數(shù)都處于程序范圍 內(nèi),而EFC的被調(diào)用函數(shù)處于程序范圍以外,通常為調(diào)用動(dòng)態(tài)鏈接庫內(nèi)的函數(shù)。
IFC根據(jù)調(diào)用形式的不同,還可以分為內(nèi)部函數(shù)靜態(tài)調(diào)用IFSCdnternal Function Static Calling)和內(nèi)部函數(shù)動(dòng)態(tài)調(diào)用 IFDC(Internal Function Dynamic Calling)。靜態(tài)調(diào)用指調(diào)用的目標(biāo)函數(shù)在編譯時(shí)已經(jīng)確定,動(dòng)態(tài)調(diào)用指調(diào)用的目標(biāo)函數(shù)在 編譯時(shí)尚未明確,當(dāng)程序運(yùn)行到調(diào)用點(diǎn)時(shí),才確定調(diào)用的目標(biāo)函數(shù)。
在現(xiàn)有技術(shù)中,獲取模塊函數(shù)接口的方法是在編譯鏈接程序的時(shí)候,利用編譯器 生成每個(gè)目標(biāo)文件的函數(shù)依賴關(guān)系,然后匯總分析形成模塊之間的函數(shù)接口關(guān)系。
在實(shí)現(xiàn)本申請(qǐng)實(shí)施例中技術(shù)方案的過程中,本申請(qǐng)發(fā)明人發(fā)現(xiàn)現(xiàn)有技術(shù)中至少存 在如下技術(shù)問題
在依賴于編譯時(shí)對(duì)源碼的依賴關(guān)系提取,無法適用于源碼不完整的程序的接口分 析;
程序內(nèi)回調(diào)函數(shù)等動(dòng)態(tài)調(diào)用關(guān)系只能通過人工配置維護(hù),無法自動(dòng)提?。?br>
由于任務(wù)調(diào)度信息的傳統(tǒng)獲取方法的上述缺點(diǎn),導(dǎo)致對(duì)模塊函數(shù)接口的分析一直 存在動(dòng)態(tài)調(diào)用關(guān)系維護(hù)難度大、適用場(chǎng)景有限等問題。發(fā)明內(nèi)容
本發(fā)明提供一種獲取程序中模塊間函數(shù)接口的方法和系統(tǒng),用于實(shí)現(xiàn)自動(dòng)對(duì)模塊間函數(shù)接口進(jìn)行獲取的目的。
一方面,本發(fā)明通過本申請(qǐng)中的一個(gè)實(shí)施例,提供如下技術(shù)方案
一種獲取程序中模塊間函數(shù)接口的方法,用于獲取可執(zhí)行程序中模塊間函數(shù)接 口,所述方法包括
通過靜態(tài)掃描所述可執(zhí)行程序,生成內(nèi)部函數(shù)靜態(tài)調(diào)用IFSC關(guān)系文件、外部函數(shù) 調(diào)用EFC關(guān)系文件,及內(nèi)部函數(shù)動(dòng)態(tài)調(diào)用IFDC出口清單文件;
在運(yùn)行所述可執(zhí)行程序時(shí),基于所述IFDC出口清單文件,生成IFDC記錄文件;
基于所述EFC關(guān)系文件、所述IFSC關(guān)系文件及IFDC記錄文件,獲得所述可執(zhí)行程 序中1旲塊間的函數(shù)調(diào)用關(guān)系表。
可選地,在所述基于所述EFC關(guān)系文件、所述IFSC關(guān)系文件及IFDC記錄文件,獲 得所述可執(zhí)行程序中模塊間的函數(shù)調(diào)用關(guān)系表之后,基于所述可執(zhí)行程序中模塊間的實(shí)際 函數(shù)接口關(guān)系及標(biāo)準(zhǔn)函數(shù)接口關(guān)系,獲得所述可執(zhí)行程序中模塊間的函數(shù)接口變更信息。
可選地,所述獲得所述可執(zhí)行程序中模塊間的函數(shù)接口變更信息,具體包括
基于所述實(shí)際函數(shù)調(diào)用關(guān)系表和模塊內(nèi)部函數(shù)清單,獲得所述可執(zhí)行程序中模塊 間的實(shí)際函數(shù)接口關(guān)系;
基于所述可執(zhí)行程序的標(biāo)準(zhǔn)模塊函數(shù)接口配置文件,獲得所述可執(zhí)行程序中模塊 間的標(biāo)準(zhǔn)函數(shù)接口關(guān)系;
比較所述可執(zhí)行程序中模塊間的實(shí)際函數(shù)接口關(guān)系及標(biāo)準(zhǔn)函數(shù)接口關(guān)系,獲得所 述可執(zhí)行程序中模塊間的函數(shù)接口變更信息文件。
可選地,所述通過靜態(tài)掃描所述可執(zhí)行程序,生成內(nèi)部函數(shù)靜態(tài)調(diào)用IFSC關(guān)系文 件、外部函數(shù)調(diào)用EFC關(guān)系文件,及內(nèi)部函數(shù)動(dòng)態(tài)調(diào)用IFDC出口清單文件,具體包括
提取所述可執(zhí)行程序中每個(gè)函數(shù)的用來表征每個(gè)函數(shù)特征的屬性信息;
分析所述可執(zhí)行程序的重定位段,生成所述外部函數(shù)調(diào)用EFC關(guān)系文件;
掃描所述可執(zhí)行程序的每個(gè)函數(shù)的函數(shù)代碼段,獲得每個(gè)函數(shù)的函數(shù)調(diào)用指令;
在所述函數(shù)調(diào)用指令中指定的函數(shù)調(diào)用方式為寄存器形式時(shí),生成所述IFDC出 口清單文件;
在所述函數(shù)調(diào)用指令中指定的函數(shù)調(diào)用方式為操作數(shù)形式時(shí),生成所述IFSC關(guān) 系文件。
可選地,所述每個(gè)函數(shù)的屬性信息至少包括函數(shù)名稱、函數(shù)類型、函數(shù)開始地址 和函數(shù)的代碼段大小。
可選地,所述在運(yùn)行所述可執(zhí)行程序時(shí),基于所述IFDC清單文件,生成IFDC記錄 文件,具體包括
所述可執(zhí)行程序運(yùn)行時(shí),執(zhí)行所述可執(zhí)行程序初始化段內(nèi)的提取動(dòng)態(tài)調(diào)用關(guān)系模 塊的初始化代碼,以獲得所述IFDC出口清單文件;
執(zhí)行每個(gè)函數(shù)頭部?jī)?nèi)的動(dòng)態(tài)調(diào)用關(guān)系模塊的提取代碼,以獲得每個(gè)函數(shù)的上級(jí)函 數(shù)調(diào)用出口地址;
當(dāng)所述IFDC出口清單文件中存在所述調(diào)用出口地址時(shí)且所述IFDC出口清單文件 對(duì)應(yīng)的目標(biāo)函數(shù)列表中包括所述調(diào)用出口地址對(duì)應(yīng)函數(shù)時(shí),則記錄所述調(diào)用出口地址對(duì)應(yīng) 函數(shù)的IFDC信息;
當(dāng)所述IFDC出口清單文件中存在所述調(diào)用出口地址時(shí)且所述IFDC出口清單文件 對(duì)應(yīng)的目標(biāo)函數(shù)列表中不包括所述調(diào)用出口地址對(duì)應(yīng)函數(shù)時(shí),則在為所述調(diào)用出口地址對(duì) 應(yīng)函數(shù)建立新的IFDC關(guān)系之后,記錄所述調(diào)用出口地址對(duì)應(yīng)函數(shù)的IFDC信息;
當(dāng)所述可執(zhí)行程序運(yùn)行結(jié)束時(shí),提取出每個(gè)函數(shù)的IFDC信息,在程序目錄下生成 所述IFDC記錄文件。
可選地,所述執(zhí)行每個(gè)函數(shù)頭部?jī)?nèi)的動(dòng)態(tài)調(diào)用關(guān)系模塊的提取代碼,以獲得每個(gè) 函數(shù)的上級(jí)函數(shù)調(diào)用出口地址的步驟,具體包括
將從寄存器中,獲取每個(gè)函數(shù)的上級(jí)函數(shù)調(diào)用出口的下一條指令的地址;
修正所述下一條指令的地址,得到所述上級(jí)函數(shù)調(diào)用出口地址。
可選地,所述基于所述EFC關(guān)系文件、所述IFSC關(guān)系文件及IFDC記錄文件,獲得 所述可執(zhí)行程序中模塊間的函數(shù)調(diào)用關(guān)系表,具體包括
利用分析工具,對(duì)所述EFC關(guān)系文件、所述IFSC關(guān)系文件及IFDC記錄文件進(jìn)行解 析,獲得所述可執(zhí)行程序中模塊間的函數(shù)調(diào)用關(guān)系表。
可選地,所述函數(shù)調(diào)用關(guān)系表中每條函數(shù)調(diào)用關(guān)系至少包括父函數(shù)名稱、調(diào)用出 口地址、目標(biāo)函數(shù)名稱、調(diào)用方式、父函數(shù)對(duì)應(yīng)源文件。
此外,本發(fā)明還通過本申請(qǐng)中的另一實(shí)施例提供如下技術(shù)方案
一種獲取程序中模塊間函數(shù)接口的系統(tǒng),用于獲取可執(zhí)行程序中模塊間函數(shù)接 口,所述系統(tǒng)包括
靜態(tài)掃描單元,用于通過靜態(tài)掃描所述可執(zhí)行程序,生成內(nèi)部函數(shù)靜態(tài)調(diào)用IFSC 關(guān)系文件、外部函數(shù)調(diào)用EFC關(guān)系文件,及內(nèi)部函數(shù)動(dòng)態(tài)調(diào)用IFDC出口清單文件;
IFDC記錄文件獲得單元,用于在運(yùn)行所述可執(zhí)行程序時(shí),基于所述IFDC出口清單 文件,生成IFDC記錄文件;
函數(shù)調(diào)用關(guān)系獲得單元,用于基于所述EFC關(guān)系文件、所述IFSC關(guān)系文件及IFDC 記錄文件,獲得所述可執(zhí)行程序中模塊間的函數(shù)調(diào)用關(guān)系表。
可選地,所述系統(tǒng)還包括函數(shù)接口變更信息獲得單元,用于基于所述可執(zhí)行程序 中模塊間的實(shí)際函數(shù)接口關(guān)系及標(biāo)準(zhǔn)函數(shù)接口關(guān)系,獲得所述可執(zhí)行程序中模塊間的函數(shù) 接口變更信息。
可選地,所述函數(shù)接口變更信息獲得單元具體包括
第一獲得單元,用于基于所述函數(shù)調(diào)用關(guān)系表,獲得所述可執(zhí)行程序中模塊間的 實(shí)際函數(shù)接口關(guān)系;
第二獲得單元,用于基于所述可執(zhí)行程序的標(biāo)準(zhǔn)模塊函數(shù)接口配置文件,獲得所 述可執(zhí)行程序中模塊間的標(biāo)準(zhǔn)函數(shù)接口關(guān)系;
比較單元,用于比較所述可執(zhí)行程序中模塊間的實(shí)際函數(shù)接口關(guān)系及標(biāo)準(zhǔn)函數(shù)接 口關(guān)系,獲得所述可執(zhí)行程序中模塊間的函數(shù)接口變更信息文件。
可選地,所述靜態(tài)掃描單元,具體包括
提取單元,用于提取所述可執(zhí)行程序中每個(gè)函數(shù)的用來表征每個(gè)函數(shù)特征的屬性信息;
分析單元,用于分析所述可執(zhí)行程序的重定位段,生成所述外部函數(shù)調(diào)用EFC關(guān) 系文件;
掃描單元,用于掃描所述可執(zhí)行程序的每個(gè)函數(shù)的函數(shù)代碼段,獲得每個(gè)函數(shù)的 函數(shù)調(diào)用指令;
第一生成單元,用于在所述函數(shù)調(diào)用指令中指定的函數(shù)調(diào)用方式為寄存器形式 時(shí),生成所述IFDC出口清單文件;
第二生成單元,用于在所述函數(shù)調(diào)用指令中指定的函數(shù)調(diào)用方式為操作數(shù)形式 時(shí),生成所述IFSC關(guān)系文件。
可選地,所述每個(gè)函數(shù)的屬性信息至少包括函數(shù)名稱、函數(shù)類型、函數(shù)開始地址 和函數(shù)的代碼段大小。
可選地,所述IFDC記錄文件獲得單元,具體包括
第一執(zhí)行單元,用于所述可執(zhí)行程序運(yùn)行時(shí),執(zhí)行所述可執(zhí)行程序初始化段內(nèi)的 提取動(dòng)態(tài)調(diào)用關(guān)系模塊的初始化代碼,以獲得所述IFDC出口清單文件;
第二執(zhí)行單元,用于執(zhí)行每個(gè)函數(shù)頭部?jī)?nèi)的動(dòng)態(tài)調(diào)用關(guān)系模塊的提取代碼,以獲 得每個(gè)函數(shù)的上級(jí)函數(shù)調(diào)用出口地址;
記錄單元,用于當(dāng)所述IFDC出口清單文件中存在所述調(diào)用出口地址時(shí)且所述 IFDC出口清單文件對(duì)應(yīng)的目標(biāo)函數(shù)列表中包括所述調(diào)用出口地址對(duì)應(yīng)函數(shù)時(shí),則記錄所 述調(diào)用出口地址對(duì)應(yīng)函數(shù)的IFDC信息;當(dāng)所述IFDC出口清單文件中存在所述調(diào)用出口地 址時(shí)且所述IFDC出口清單文件對(duì)應(yīng)的目標(biāo)函數(shù)列表中不包括所述調(diào)用出口地址對(duì)應(yīng)函數(shù) 時(shí),則在為所述調(diào)用出口地址對(duì)應(yīng)函數(shù)建立新的IFDC關(guān)系之后,記錄所述調(diào)用出口地址對(duì) 應(yīng)函數(shù)的IFDC信息;
提取單元,用于當(dāng)所述可執(zhí)行程序運(yùn)行結(jié)束時(shí),提取出每個(gè)函數(shù)的IFDC信息寫文 件,在程序目錄下生成所述IFDC記錄文件。
可選地,所述第二執(zhí)行單元,具體包括
獲取單元,用于從寄存器中,獲取每個(gè)函數(shù)的上級(jí)函數(shù)調(diào)用出口的下一條指令的 地址;
修正單元,用于修正所述下一條指令的地址,得到所述上級(jí)函數(shù)調(diào)用出口地址。
可選地,所述函數(shù)調(diào)用關(guān)系獲得單元具體為解析單元,用于對(duì)所述EFC關(guān)系文 件、所述IFSC關(guān)系文件及IFDC記錄文件進(jìn)行解析,獲得所述可執(zhí)行程序中模塊間的函數(shù)調(diào) 用關(guān)系表。
可選地,所述函數(shù)調(diào)用關(guān)系表中每條函數(shù)調(diào)用關(guān)系至少包括父函數(shù)名稱、調(diào)用出 口地址、目標(biāo)函數(shù)名稱、調(diào)用方式、父函數(shù)對(duì)應(yīng)源文件。
上述技術(shù)方案中的一個(gè)或多個(gè)技術(shù)方案,具有如下技術(shù)效果或優(yōu)點(diǎn)
一、通過在獲取程序中模塊間函數(shù)接口的過程中,采用了插入鉤子函數(shù),靜態(tài)掃描 可執(zhí)行程序技術(shù)手段,使得在程序進(jìn)行每一次內(nèi)部函數(shù)調(diào)用的過程中,實(shí)現(xiàn)動(dòng)態(tài)調(diào)用關(guān)系 容易維護(hù)的技術(shù)效果;
二、通過在獲取程序中模塊間函數(shù)接口的過程中,采用了將可執(zhí)行程序中模塊間 的實(shí)際函數(shù)接口關(guān)系與標(biāo)準(zhǔn)函數(shù)接口關(guān)系進(jìn)行對(duì)比的手段,使得在獲取可執(zhí)行程序中模塊 間的函數(shù)接口變更信息文件的過程中,實(shí)現(xiàn)動(dòng)態(tài)調(diào)用關(guān)系適用場(chǎng)景不受限制的技術(shù)效果。
圖1為本申請(qǐng)實(shí)施例中獲取程序中模塊間函數(shù)接口的方法流程圖2為本申請(qǐng)實(shí)施例中獲得及提取IFDC記錄文件的方法流程圖3為本申請(qǐng)實(shí)施例中提取函數(shù)調(diào)用關(guān)系的方法流程圖4為本申請(qǐng)實(shí)施例中獲得函數(shù)接口變更信息的方法流程圖5為本申請(qǐng)實(shí)施例中獲取程序中模塊間函數(shù)接口的系統(tǒng)模塊圖6為本申請(qǐng)實(shí)施例中靜態(tài)掃描單元的模塊圖7為本申請(qǐng)實(shí)施例中IFDC記錄文件獲得單元的模塊圖8為本申請(qǐng)實(shí)施例中函數(shù)接口變更信息獲得單元的模塊圖。
具體實(shí)施方式
為了使本申請(qǐng)所屬技術(shù)領(lǐng)域中的技術(shù)人員更清楚地理解本發(fā)明,下面結(jié)合附圖, 通過具體實(shí)施例對(duì)本發(fā)明技術(shù)方案作詳細(xì)描述。
請(qǐng)參考圖1、圖2、圖3和圖4,本申請(qǐng)實(shí)施例一中的獲取程序中模塊間函數(shù)接口的方法,包括如下步驟
步驟101,通過靜態(tài)掃描一可執(zhí)行程序,生成內(nèi)部函數(shù)靜態(tài)調(diào)用IFSC關(guān)系文件、外部函數(shù)調(diào)用EFC關(guān)系文件,及內(nèi)部函數(shù)動(dòng)態(tài)調(diào)用IFDC出口清單文件。
在具體實(shí)施過程中,所述可執(zhí)行程序通過如下步驟生成先編譯源代碼,然后插入函數(shù)調(diào)用的鉤子函數(shù),通過該步驟可在程序中預(yù)先植入鉤子函數(shù)的代碼,使其能夠在程序運(yùn)行時(shí)完成IFDC信息的提取。
其中,插入函數(shù)調(diào)用的鉤子函數(shù)具體實(shí)現(xiàn)過程如下
一,在程序的init段插入動(dòng)態(tài)調(diào)用關(guān)系提取的初始化代碼;
所述程序中的每一個(gè)可執(zhí)行文件,都包含一個(gè)對(duì)應(yīng)的init段,所述init段在所述程序加載時(shí)得到一次性運(yùn)行。
二,在所有的函數(shù)入口處插入動(dòng)態(tài)調(diào)用關(guān)系提取代碼。
根據(jù)編譯時(shí)在makefile中設(shè)置的開關(guān),在指定文件中所有函數(shù)的入口處添加提取所述動(dòng)態(tài)函數(shù)調(diào)用的代碼片段。通過運(yùn)行該代碼片段可以提取當(dāng)前函數(shù)的上級(jí)函數(shù)調(diào)用出口 ;并判斷所述上級(jí)函數(shù)調(diào)用出口是否在IFDC出口清單里;并在動(dòng)態(tài)調(diào)用出口已經(jīng)存在時(shí),生成動(dòng)態(tài)調(diào)用記錄。
對(duì)于步驟101,在具體實(shí)施過程中,具體包括
一,提取所述可執(zhí)行程序中每個(gè)函數(shù)的用來表征每個(gè)函數(shù)特征的屬性信息,如函數(shù)名稱、類型、地址、大小等。在所述程序文件的Symbol符號(hào)段里,包含了所有函數(shù)與變量符號(hào)信息。一個(gè)符號(hào)的定義如下
typedef struct {Ε1β2—Wordst—name;Il名稱的偏移入口ElB2_Addrst—value;;丨I符號(hào)的段地址偏移ElB2_Wordst—size; /V符號(hào)的大小unsigned charst—info; /V符號(hào)的類型等unsigned charst—other;Ε1β2—Halfst shndx; /丨丨關(guān)聯(lián)的段
} Ε1β2—Sym;
其中,st_info字段的低4位為st_type信息,所有函數(shù)符號(hào)的st_type值為STT_ FUNC。提取所有符合該特征的函數(shù)符號(hào)則形成函數(shù)清單。
然后,根據(jù)存在于程序中SHT_STRTAB段中的st_name,提取該符號(hào)的名稱。根據(jù) st_value并結(jié)合st_shndx對(duì)應(yīng)段的加載地址,計(jì)算出符號(hào)的開始地址。從st_size字段獲得符號(hào)的大小,即函數(shù)的長度,并結(jié)合函數(shù)的開始地址,得到函數(shù)的結(jié)束地址。所述函數(shù)的開始地址與結(jié)束地址之間,則為函數(shù)的代碼區(qū)間。
二,分析所述可執(zhí)行程序的重定位段,生成所述外部函數(shù)調(diào)用EFC關(guān)系文件;
其中,生成所述外部函數(shù)調(diào)用EFC關(guān)系文件的過程具體為所述可執(zhí)行程序文件在編譯鏈接后,會(huì)針對(duì)外部動(dòng)態(tài)庫的符號(hào)引用,在SHT_RELA段中保存對(duì)應(yīng)的重定位信息。 所述SHT_RELA段為所述可執(zhí)行程序文件中的地址段或代碼段,所述重定位信息的格式為
typedef struct {ElB2_Addr r offset; Il 重定位地址 ElB2_Word r—info; Il 重定位信息 } Ε1β2—Rel;
根據(jù)所可以計(jì)算出代碼段中需要重定位的地址,S卩,調(diào)用所述外部動(dòng)態(tài)庫函數(shù)的指令的地址。根據(jù)所述1"」1^0獲得調(diào)用的外部符號(hào),進(jìn)一步在符號(hào)表中查詢 st_type為STT_UNDEF的符號(hào),可得到調(diào)用的外部動(dòng)態(tài)庫的函數(shù)名稱,從而形成所述可執(zhí)行程序的EFC信息。完成對(duì)所述可執(zhí)行程序的掃描后,會(huì)在所述可執(zhí)行程序文件目錄下,生成所述EFC關(guān)系文件。
三,掃描所述可執(zhí)行程序的每個(gè)函數(shù)的函數(shù)代碼段,獲得每個(gè)函數(shù)的函數(shù)調(diào)用指令,具體包括
根據(jù)函數(shù)符號(hào)清單,獲得所述程序中每個(gè)函數(shù)的代碼區(qū)間,所述每個(gè)函數(shù)的代碼區(qū)間內(nèi)是所述每個(gè)函數(shù)的每一條指令的機(jī)器碼,即,指令碼,所述指令碼通常由指令操作符和操作數(shù)組成。
對(duì)于不同的CPU體系,指令格式是不同的,如intel的CPU體系中的指令格式和AMD的CPU體系中的指令格式是不一樣的;但對(duì)于同一類型的所述CPU體系,基礎(chǔ)指令格式 是固定的,如intel的奔騰系列的CPU中的基礎(chǔ)指令格式是固定的。
確定所述CPU的體系,并按照所述CPU體系中對(duì)應(yīng)CPU的指令格式,逐條讀入所述 每個(gè)函數(shù)的所述指令碼,然后提取所述指令碼中的操作碼,并判斷所述CPU的指令是否為 函數(shù)調(diào)用指令。其中,判斷的結(jié)果包括兩種情況
第一種,所述CPU的指令不是所述函數(shù)調(diào)用指令,則不進(jìn)行下一步分析函數(shù)調(diào)用 的處理;
第二種,所述CPU的指令是所述函數(shù)調(diào)用指令,則進(jìn)一步判斷屬于何種函數(shù)調(diào)用。
在進(jìn)一步判斷屬于何種函數(shù)調(diào)用時(shí),通過識(shí)別所述CPU的指令的操作碼,判斷所 述函數(shù)調(diào)用指令中指定的調(diào)用函數(shù)的調(diào)用方式,所述調(diào)用函數(shù)的調(diào)用方式具體包括兩種
第一種,以寄存器形式調(diào)用;
第二種,以操作數(shù)形式調(diào)用。
在所述函數(shù)調(diào)用指令中指定的函數(shù)調(diào)用方式為寄存器形式時(shí),所述函數(shù)無法通過 靜態(tài)分析程序代碼獲取目標(biāo)函數(shù)信息,需要在后續(xù)的程序運(yùn)行過程中進(jìn)行提取。因此,需要 將未確定的所述目標(biāo)函數(shù)的調(diào)用指令出口記錄,供所述可執(zhí)行程序運(yùn)行時(shí)的編譯內(nèi)嵌功能 使用。完成對(duì)所述可執(zhí)行程序的掃描后,會(huì)在所述可執(zhí)行程序文件目錄下,生成所述IFDC 出口清單文件。
在所述函數(shù)調(diào)用指令中指定的函數(shù)調(diào)用方式為操作數(shù)形式時(shí),從所述函數(shù)調(diào)用指 令碼中,提取對(duì)應(yīng)的操作數(shù),按照尋址方式,轉(zhuǎn)換成對(duì)應(yīng)的目標(biāo)函數(shù)絕對(duì)地址。然后在所述 函數(shù)符號(hào)清單中,查找調(diào)用的所述目標(biāo)函數(shù)名稱。
將所述調(diào)用出口、目標(biāo)函數(shù)形成一條IFSC關(guān)系并進(jìn)行記錄。完成對(duì)所述可執(zhí)行程 序的掃描后,會(huì)在所述可執(zhí)行程序文件目錄下,生成所述完整的IFSC關(guān)系文件。
步驟102,在運(yùn)行所述可執(zhí)行程序時(shí),基于所述IFDC出口清單文件,生成IFDC記錄 文件。
在具體實(shí)施過程中,所述可執(zhí)行程序運(yùn)行時(shí),首先,執(zhí)行init段中內(nèi)嵌的初始化 功能,提取動(dòng)態(tài)調(diào)用關(guān)系模塊的初始化代碼,以獲得所述IFDC出口清單文件,然后,加載所 述IFDC出口清單文件,所述IFDC出口清單文件里包含了所有需要提取的函數(shù)動(dòng)態(tài)調(diào)用關(guān) 系,如內(nèi)部函數(shù)靜態(tài)調(diào)用IFSC關(guān)系文件、內(nèi)部函數(shù)動(dòng)態(tài)調(diào)用IFDC關(guān)系文件、外部函數(shù)調(diào)用 EFC關(guān)系文件等,執(zhí)行每個(gè)函數(shù)頭部?jī)?nèi)的動(dòng)態(tài)調(diào)用關(guān)系模塊的提取代碼,獲得所述每個(gè)函數(shù) 的上級(jí)函數(shù)調(diào)用出口地址;
其中,所述每個(gè)函數(shù)的上級(jí)函數(shù)調(diào)用出口地址獲得方式具體為所述動(dòng)態(tài)調(diào)用關(guān) 系模塊的提取代碼從ra寄存器中,獲取當(dāng)前函數(shù)的上級(jí)函數(shù)調(diào)用出口的下一條指令的地 址,修正后得到所述上級(jí)函數(shù)調(diào)用出口地址CP(Calling Point)。
進(jìn)一步,在所述IFDC清單中,查找所述CP是否存在。其中,查找的結(jié)果包括兩種 情況
第一種,所述CP不存在于所述IFDC清單中,則表示所述當(dāng)前函數(shù)調(diào)用不需要記 錄,繼續(xù)分析后續(xù)的函數(shù)的其它指令;
第二種,所述CP存在于所述IFDC清單中,則表示所述當(dāng)前函數(shù)調(diào)用是需要記錄的 動(dòng)態(tài)調(diào)用。
此時(shí),在所述IFDC清單對(duì)應(yīng)的函數(shù)出口條目中,查找目標(biāo)函數(shù)列表。其中,查找的 結(jié)果也包括兩種情況
第一種,當(dāng)前函數(shù)在所述目標(biāo)函數(shù)列表中,則記錄所述調(diào)用出口地址對(duì)應(yīng)函數(shù)的 IFDC信息;
第二種,當(dāng)前函數(shù)不在所述目標(biāo)函數(shù)列表中,則建立一條新的IFDC關(guān)系,記錄所 述調(diào)用出口地址對(duì)應(yīng)函數(shù)的IFDC信息,并將所述IFDC信息寫文件添加到所述目標(biāo)函數(shù)列表中。
當(dāng)程序運(yùn)行結(jié)束時(shí),提取出每個(gè)函數(shù)的IFDC信息,在所述可執(zhí)行程序目錄下生成 所述IFDC記錄文件。
步驟103,基于所述EFC關(guān)系文件、所述IFSC關(guān)系文件及IFDC記錄文件,獲得所述 可執(zhí)行程序中模塊間的函數(shù)調(diào)用關(guān)系表。
在具體實(shí)施過程中,當(dāng)程序運(yùn)行完畢并生成了 IFDC記錄文件后,結(jié)合靜態(tài)掃描 程序文件得到的所述IFSC文件與EFC文件,解析出完整的函數(shù)調(diào)用關(guān)系表FC (Function Calling)。
其中,每一條FC信息包含多種屬性信息,如父函數(shù)名稱、調(diào)用出口地址、目標(biāo)函 數(shù)名稱、調(diào)用方式、父函數(shù)對(duì)應(yīng)源文件等,供進(jìn)一步分析模塊之間的函數(shù)接口關(guān)系。
在具體分析時(shí),基于所述函數(shù)調(diào)用關(guān)系表,獲得所述可執(zhí)行程序中模塊間的實(shí)際 函數(shù)接口關(guān)系;其中,具體過程為所述解析出完整的函數(shù)調(diào)用關(guān)系表后,加載程序內(nèi)部模 塊配置表IMC(Intemal Module Configuration)文件,將所述可執(zhí)行程序內(nèi)所有函數(shù)之間 的調(diào)用關(guān)系轉(zhuǎn)換成所有模塊的函數(shù)調(diào)用關(guān)系MFC (Module Function Calling),在所述所有 模塊的函數(shù)調(diào)用關(guān)系MFC的基礎(chǔ)上,過濾掉所述調(diào)用出口與目標(biāo)函數(shù)屬于同一個(gè)模塊的模 塊內(nèi)部調(diào)用關(guān)系,得到模塊之間的實(shí)際函數(shù)接口關(guān)系MFI (Module Function Interface)。
基于所述可執(zhí)行程序的標(biāo)準(zhǔn)模塊函數(shù)接口配置文件,獲得所述可執(zhí)行程序中模 塊間的標(biāo)準(zhǔn)函數(shù)接口關(guān)系;其中,具體過程為從模塊接口設(shè)計(jì)方案中導(dǎo)出,或在掃描得到 的模塊函數(shù)接口信息基礎(chǔ)上進(jìn)行修訂得到所述可執(zhí)行程序的標(biāo)準(zhǔn)模塊函數(shù)接口配置文件 SMFIC (Standard Module Function Interface Configuration),所述可執(zhí)行程序的標(biāo)準(zhǔn)模 塊函數(shù)接口配置具體為一個(gè)標(biāo)準(zhǔn)模塊函數(shù)接口信息,記錄了軟件設(shè)計(jì)中各模塊之間的標(biāo)準(zhǔn) 函數(shù)接口關(guān)系。
比較所述可執(zhí)行程序中模塊間的實(shí)際函數(shù)接口關(guān)系及標(biāo)準(zhǔn)函數(shù)接口關(guān)系,獲得 所述可執(zhí)行程序中模塊間的函數(shù)接口變更信息;其中,具體過程為分析所述可執(zhí)行程序 中模塊間的實(shí)際函數(shù)接口關(guān)系與標(biāo)準(zhǔn)函數(shù)接口關(guān)系,所述分析完成后,比較出兩者之間 的差異,所述的差異即為所述可執(zhí)行程序中模塊間的函數(shù)接口變更信息MFICI (Module Function Interface Change Information)。
請(qǐng)參考圖5、圖6、圖7和圖8,本申請(qǐng)實(shí)施例二中的獲取程序中模塊間函數(shù)接口的 系統(tǒng),包括
靜態(tài)掃描單元201,用于通過靜態(tài)掃描所述可執(zhí)行程序,生成內(nèi)部函數(shù)靜態(tài)調(diào)用 IFSC關(guān)系文件、外部函數(shù)調(diào)用EFC關(guān)系文件,及內(nèi)部函數(shù)動(dòng)態(tài)調(diào)用IFDC出口清單文件;
具體來講,所述靜態(tài)掃描單元201,包括
提取單元2011,用于提取所述可執(zhí)行程序中每個(gè)函數(shù)的用來表征每個(gè)函數(shù)特征的屬性信息,如函數(shù)名稱、類型、地址、大小等。
分析單元2012,用于分析所述可執(zhí)行程序的重定位段,生成所述外部函數(shù)調(diào)用 EFC關(guān)系文件,如分析所述重定位段中計(jì)算出代碼段中需要重定位的地址, 即調(diào)用外部動(dòng)態(tài)庫函數(shù)的指令的地址。
掃描單元2013,用于掃描所述可執(zhí)行程序的每個(gè)函數(shù)的函數(shù)代碼段,獲得每個(gè)函 數(shù)的函數(shù)調(diào)用指令,如掃描所述可執(zhí)行程序的Symbol符號(hào)段,獲取所述符號(hào)段中st_size 字段的地址。
第一生成單元2014,用于在所述函數(shù)調(diào)用指令中指定的函數(shù)調(diào)用方式為寄存器形 式時(shí),生成所述IFDC出口清單文件;
第二生成單元2015,用于在所述函數(shù)調(diào)用指令中指定的函數(shù)調(diào)用方式為操作數(shù)形 式時(shí),生成所述IFSC關(guān)系文件。
IFDC記錄文件獲得單元202,用于在運(yùn)行所述可執(zhí)行程序時(shí),基于所述IFDC出口 清單文件,生成IFDC記錄文件;
具體來講,所述IFDC記錄文件獲得單元202,包括
第一執(zhí)行單元2021,用于所述可執(zhí)行程序運(yùn)行時(shí),執(zhí)行所述可執(zhí)行程序初始化段 內(nèi)的提取動(dòng)態(tài)調(diào)用關(guān)系模塊的初始化代碼,在所述可執(zhí)行化程序加載時(shí)得到一次性運(yùn)行, 以獲得所述IFDC出口清單文件。
第二執(zhí)行單元2022,用于執(zhí)行每個(gè)函數(shù)頭部?jī)?nèi)的動(dòng)態(tài)調(diào)用關(guān)系模塊的提取代碼, 以獲得每個(gè)函數(shù)的上級(jí)函數(shù)調(diào)用出口地址,如根據(jù)編譯時(shí)在makefile中設(shè)置的開關(guān),在 指定文件中所有函數(shù)的入口處添加提取動(dòng)態(tài)函數(shù)調(diào)用的代碼片段。
記錄單元2023,用于當(dāng)所述IFDC出口清單文件中存在所述調(diào)用出口地址時(shí)且所 述IFDC出口清單文件對(duì)應(yīng)的目標(biāo)函數(shù)列表中包括所述調(diào)用出口地址對(duì)應(yīng)函數(shù)時(shí),則記錄 所述調(diào)用出口地址對(duì)應(yīng)函數(shù)的IFDC信息;當(dāng)所述IFDC出口清單文件中存在所述調(diào)用出口 地址時(shí)且所述IFDC出口清單文件對(duì)應(yīng)的目標(biāo)函數(shù)列表中不包括所述調(diào)用出口地址對(duì)應(yīng)函 數(shù)時(shí),則在為所述調(diào)用出口地址對(duì)應(yīng)函數(shù)建立新的IFDC關(guān)系之后,記錄所述調(diào)用出口地址 對(duì)應(yīng)函數(shù)的IFDC信息;
提取單元2024,用于當(dāng)所述可執(zhí)行程序運(yùn)行結(jié)束時(shí),提取出每個(gè)函數(shù)的IFDC信 息,在程序目錄下生成所述IFDC記錄文件。
函數(shù)調(diào)用關(guān)系獲得單元203,用于基于所述EFC關(guān)系文件、所述IFSC關(guān)系文件及 IFDC記錄文件,獲得所述可執(zhí)行程序中模塊間的函數(shù)調(diào)用關(guān)系表。
具體來講,當(dāng)程序運(yùn)行完畢并生成了所述IFDC記錄文件后,結(jié)合靜態(tài)掃描程 序文件得到的所述IFSC文件與EFC文件,解析出完整的函數(shù)調(diào)用關(guān)系表FC (Function Calling)。
其中,每一條FC信息包含多種屬性信息,如父函數(shù)名稱、調(diào)用出口地址、目標(biāo)函 數(shù)名稱、調(diào)用方式、父函數(shù)對(duì)應(yīng)源文件等,供進(jìn)一步分析模塊之間的函數(shù)接口關(guān)系。
此外,所述系統(tǒng)還包括函數(shù)接口變更信息獲得單元,用于基于所述可執(zhí)行程序中 模塊間的實(shí)際函數(shù)接口關(guān)系及標(biāo)準(zhǔn)函數(shù)接口關(guān)系,獲得所述可執(zhí)行程序中模塊間的函數(shù)接 口變更信息。
所述函數(shù)接口變更信息獲得單元,具體包括
第一獲得單元2041,用于基于所述函數(shù)調(diào)用關(guān)系表,獲得所述可執(zhí)行程序中模塊 間的實(shí)際函數(shù)接口關(guān)系;
具體來講,在分析時(shí),基于所述函數(shù)調(diào)用關(guān)系表,獲得所述可執(zhí)行程序中模塊間的 實(shí)際函數(shù)接口關(guān)系;
其中,具體過程為所述解析出完整的函數(shù)調(diào)用關(guān)系表后,加載程序內(nèi)部模塊配置 表文件,將所述可執(zhí)行程序內(nèi)所有函數(shù)之間的調(diào)用關(guān)系轉(zhuǎn)換成所有模塊的函數(shù)調(diào)用關(guān)系, 在所述所有模塊的函數(shù)調(diào)用關(guān)系的基礎(chǔ)上,過濾掉所述調(diào)用出口與目標(biāo)函數(shù)屬于同一個(gè)模 塊的模塊內(nèi)部調(diào)用關(guān)系,得到模塊之間的實(shí)際函數(shù)接口關(guān)系。
第二獲得單元2042,用于基于所述可執(zhí)行程序的標(biāo)準(zhǔn)模塊函數(shù)接口配置文件,獲 得所述可執(zhí)行程序中模塊間的標(biāo)準(zhǔn)函數(shù)接口關(guān)系;
具體來講,在分析時(shí),基于所述可執(zhí)行程序的標(biāo)準(zhǔn)模塊函數(shù)接口配置文件,獲得所 述可執(zhí)行程序中模塊間的標(biāo)準(zhǔn)函數(shù)接口關(guān)系;其中,具體過程為從模塊接口設(shè)計(jì)方案中 導(dǎo)出,或在掃描得到的模塊函數(shù)接口信息基礎(chǔ)上進(jìn)行修訂得到所述可執(zhí)行程序的標(biāo)準(zhǔn)模塊 函數(shù)接口配置文件,所述可執(zhí)行程序的標(biāo)準(zhǔn)模塊函數(shù)接口配置具體為一個(gè)標(biāo)準(zhǔn)模塊函數(shù)接 口信息,記錄了軟件設(shè)計(jì)中各模塊之間的標(biāo)準(zhǔn)函數(shù)接口關(guān)系。
比較單元2043,用于比較所述可執(zhí)行程序中模塊間的實(shí)際函數(shù)接口關(guān)系及標(biāo)準(zhǔn)函 數(shù)接口關(guān)系,生成所述可執(zhí)行程序中模塊間的函數(shù)接口變更信息文件。
具體來講,在分析時(shí),比較所述可執(zhí)行程序中模塊間的實(shí)際函數(shù)接口關(guān)系及標(biāo)準(zhǔn) 函數(shù)接口關(guān)系,生成所述可執(zhí)行程序中模塊間的函數(shù)接口變更信息文件;其中,具體過程 為分析所述可執(zhí)行程序中模塊間的實(shí)際函數(shù)接口關(guān)系與標(biāo)準(zhǔn)函數(shù)接口關(guān)系,所述分析完 成后,比較出兩者之間的差異,所述的差異即為所述可執(zhí)行程序中模塊間的函數(shù)接口變更 信息。
本申請(qǐng)實(shí)施例中的一個(gè)或多個(gè)技術(shù)方案,至少具有如下技術(shù)效果
一、通過在獲取程序中模塊間函數(shù)接口的過程中,采用了插入鉤子函數(shù),靜態(tài)掃描 可執(zhí)行程序的技術(shù)手段,使得在程序進(jìn)行每一次內(nèi)部函數(shù)調(diào)用的過程中,實(shí)現(xiàn)動(dòng)態(tài)調(diào)用關(guān) 系容易維護(hù)的技術(shù)效果;
二、通過在獲取程序中模塊間函數(shù)接口的過程中,采用了將可執(zhí)行程序中模塊間 的實(shí)際函數(shù)接口關(guān)系與標(biāo)準(zhǔn)函數(shù)接口關(guān)系進(jìn)行對(duì)比的手段,使得在獲取可執(zhí)行程序中模塊 間的函數(shù)接口變更信息文件的過程中,實(shí)現(xiàn)動(dòng)態(tài)調(diào)用關(guān)系適用場(chǎng)景不受限制的技術(shù)效果;
三、通過在獲取程序中模塊間函數(shù)接口的過程中,采用了提取函數(shù)的指令碼,以寄 存器形式調(diào)用函數(shù)的技術(shù)手段,使得在獲得內(nèi)部函數(shù)動(dòng)態(tài)調(diào)用出口清單的過程中,實(shí)現(xiàn)準(zhǔn) 確、高效的技術(shù)效果;
四、通過在獲取程序中模塊間函數(shù)接口的過程中,采用了提取函數(shù)的指令碼,以操 作數(shù)形式調(diào)用函數(shù)的技術(shù)手段,使得在獲得內(nèi)部函數(shù)靜態(tài)調(diào)用關(guān)系的過程中,實(shí)現(xiàn)準(zhǔn)確、高 效的技術(shù)效果。
顯然,本領(lǐng)域的技術(shù)人員可以對(duì)本發(fā)明進(jìn)行各種改動(dòng)和變型而不脫離本發(fā)明的精 神和范圍。這樣,倘若本發(fā)明的這些修改和變型屬于本發(fā)明權(quán)利要求及其等同技術(shù)的范圍 之內(nèi),則本發(fā)明也意圖包含這些改動(dòng)和變型在內(nèi)。
權(quán)利要求
1.一種獲取程序中模塊間函數(shù)接口的方法,用于獲取可執(zhí)行程序中模塊間函數(shù)接口,其特征在于,所述方法包括 通過靜態(tài)掃描所述可執(zhí)行程序,生成內(nèi)部函數(shù)靜態(tài)調(diào)用IFSC關(guān)系文件、外部函數(shù)調(diào)用EFC關(guān)系文件,及內(nèi)部函數(shù)動(dòng)態(tài)調(diào)用IFDC出口清單文件; 在運(yùn)行所述可執(zhí)行程序時(shí),基于所述IFDC出口清單文件,生成IFDC記錄文件; 基于所述EFC關(guān)系文件、所述IFSC關(guān)系文件及IFDC記錄文件,獲得所述可執(zhí)行程序中模塊間的函數(shù)調(diào)用關(guān)系表。
2.如權(quán)利要求1所述的方法,其特征在于,在所述基于所述EFC關(guān)系文件、所述IFSC關(guān)系文件及IFDC記錄文件,獲得所述可執(zhí)行程序中模塊間的函數(shù)調(diào)用關(guān)系表之后,所述方法還包括 基于所述實(shí)際函數(shù)調(diào)用關(guān)系表和模塊內(nèi)部函數(shù)清單,獲得所述可執(zhí)行程序中模塊間的實(shí)際函數(shù)接口關(guān)系; 基于所述可執(zhí)行程序的標(biāo)準(zhǔn)模塊函數(shù)接口配置文件,獲得所述可執(zhí)行程序中模塊間的標(biāo)準(zhǔn)函數(shù)接口關(guān)系; 比較所述可執(zhí)行程序中模塊間的實(shí)際函數(shù)接口關(guān)系及標(biāo)準(zhǔn)函數(shù)接口關(guān)系,獲得所述可執(zhí)行程序中模塊間的函數(shù)接口變更信息文件。
3.如權(quán)利要求1或2所述的方法,其特征在于,所述通過靜態(tài)掃描所述可執(zhí)行程序,生成內(nèi)部函數(shù)靜態(tài)調(diào)用IFSC關(guān)系文件、外部函數(shù)調(diào)用EFC關(guān)系文件,及內(nèi)部函數(shù)動(dòng)態(tài)調(diào)用IFDC出口清單文件,具體包括 提取所述可執(zhí)行程序中每個(gè)函數(shù)的用來表征每個(gè)函數(shù)特征的屬性信息; 分析所述可執(zhí)行程序的重定位段,生成所述外部函數(shù)調(diào)用EFC關(guān)系文件; 掃描所述可執(zhí)行程序的每個(gè)函數(shù)的函數(shù)代碼段,獲得每個(gè)函數(shù)的函數(shù)調(diào)用指令;在所述函數(shù)調(diào)用指令中指定的函數(shù)調(diào)用方式為寄存器形式時(shí),生成所述IFDC出口清單文件; 在所述函數(shù)調(diào)用指令中指定的函數(shù)調(diào)用方式為操作數(shù)形式時(shí),生成所述IFSC關(guān)系文件。
4.如權(quán)利要求1或2所述的方法,其特征在于,所述在運(yùn)行所述可執(zhí)行程序時(shí),基于所述IFDC出口清單文件,生成IFDC記錄文件,具體包括 所述可執(zhí)行程序運(yùn)行時(shí),執(zhí)行所述可執(zhí)行程序初始化段內(nèi)的提取動(dòng)態(tài)調(diào)用關(guān)系模塊的初始化代碼,以獲得所述IFDC出口清單文件; 執(zhí)行每個(gè)函數(shù)頭部?jī)?nèi)的動(dòng)態(tài)調(diào)用關(guān)系模塊的提取代碼,以獲得每個(gè)函數(shù)的上級(jí)函數(shù)調(diào)用出口地址; 當(dāng)所述IFDC出口清單文件中存在所述調(diào)用出口地址時(shí)且所述IFDC出口清單文件對(duì)應(yīng)的目標(biāo)函數(shù)列表中包括所述調(diào)用出口地址對(duì)應(yīng)函數(shù)時(shí),則記錄所述調(diào)用出口地址對(duì)應(yīng)函數(shù)的IFDC信息; 當(dāng)所述IFDC出口清單文件中存在所述調(diào)用出口地址時(shí)且所述IFDC出口清單文件對(duì)應(yīng)的目標(biāo)函數(shù)列表中不包括所述調(diào)用出口地址對(duì)應(yīng)函數(shù)時(shí),則在為所述調(diào)用出口地址對(duì)應(yīng)函數(shù)建立新的IFDC關(guān)系之后,記錄所述調(diào)用出口地址對(duì)應(yīng)函數(shù)的IFDC信息; 當(dāng)所述可執(zhí)行程序運(yùn)行結(jié)束時(shí),提取出每個(gè)函數(shù)的IFDC信息,在程序目錄下生成所述IFDC記錄文件。
5.一種獲取程序中模塊間函數(shù)接口的系統(tǒng),用于獲取可執(zhí)行程序中模塊間函數(shù)接口,其特征在于,所述系統(tǒng)包括 靜態(tài)掃描單元,用于通過靜態(tài)掃描所述可執(zhí)行程序,生成內(nèi)部函數(shù)靜態(tài)調(diào)用IFSC關(guān)系文件、外部函數(shù)調(diào)用EFC關(guān)系文件,及內(nèi)部函數(shù)動(dòng)態(tài)調(diào)用IFDC出口清單文件; IFDC記錄文件獲得單元,用于在運(yùn)行所述可執(zhí)行程序時(shí),基于所述IFDC出口清單文件,生成IFDC記錄文件; 函數(shù)調(diào)用關(guān)系獲得單元,用于基于所述EFC關(guān)系文件、所述IFSC關(guān)系文件及IFDC記錄文件,獲得所述可執(zhí)行程序中模塊間的函數(shù)調(diào)用關(guān)系表。
6.如權(quán)利要求5所述的系統(tǒng),其特征在于,所述系統(tǒng)還包括 函數(shù)接口變更信息獲得單元,用于基于所述可執(zhí)行程序中模塊間的實(shí)際函數(shù)接口關(guān)系及標(biāo)準(zhǔn)函數(shù)接口關(guān)系,獲得所述可執(zhí)行程序中模塊間的函數(shù)接口變更信息。
7.如權(quán)利要求6所述的系統(tǒng),其特征在于,所述函數(shù)接口變更信息獲得單元具體包括 第一獲得單元,用于基于所述函數(shù)調(diào)用關(guān)系表,獲得所述可執(zhí)行程序中模塊間的實(shí)際函數(shù)接口關(guān)系; 第二獲得單元,用于基于所述可執(zhí)行程序的標(biāo)準(zhǔn)模塊函數(shù)接口配置文件,獲得所述可執(zhí)行程序中模塊間的標(biāo)準(zhǔn)函數(shù)接口關(guān)系; 比較單元,用于比較所述可執(zhí)行程序中模塊間的實(shí)際函數(shù)接口關(guān)系及標(biāo)準(zhǔn)函數(shù)接口關(guān)系,獲得所述可執(zhí)行程序中模塊間的函數(shù)接口變更信息文件。
8.如權(quán)利要求5或6所述的系統(tǒng),其特征在于,所述靜態(tài)掃描單元,具體包括 提取單元,用于提取所述可執(zhí)行程序中每個(gè)函數(shù)的用來表征每個(gè)函數(shù)特征的屬性信息; 分析單元,用于分析所述可執(zhí)行程序的重定位段,生成所述外部函數(shù)調(diào)用EFC關(guān)系文件; 掃描單元,用于掃描所述可執(zhí)行程序的每個(gè)函數(shù)的函數(shù)代碼段,獲得每個(gè)函數(shù)的函數(shù)調(diào)用指令; 第一生成單元,用于在所述函數(shù)調(diào)用指令中指定的函數(shù)調(diào)用方式為寄存器形式時(shí),生成所述IFDC出口清單文件; 第二生成單元,用于在所述函數(shù)調(diào)用指令中指定的函數(shù)調(diào)用方式為操作數(shù)形式時(shí),生成所述IFSC關(guān)系文件。
9.如權(quán)利要求5或6所述的系統(tǒng),其特征在于,所述IFDC記錄文件獲得單元,具體包括 第一執(zhí)行單元,用于所述可執(zhí)行程序運(yùn)行時(shí),執(zhí)行所述可執(zhí)行程序初始化段內(nèi)的提取動(dòng)態(tài)調(diào)用關(guān)系模塊的初始化代碼,以獲得所述IFDC出口清單文件; 第二執(zhí)行單元,用于執(zhí)行每個(gè)函數(shù)頭部?jī)?nèi)的動(dòng)態(tài)調(diào)用關(guān)系模塊的提取代碼,以獲得每個(gè)函數(shù)的上級(jí)函數(shù)調(diào)用出口地址; 記錄單元,用于當(dāng)所述IFDC出口清單文件中存在所述調(diào)用出口地址時(shí)且所述IFDC出口清單文件對(duì)應(yīng)的目標(biāo)函數(shù)列表中包括所述調(diào)用出口地址對(duì)應(yīng)函數(shù)時(shí),則記錄所述調(diào)用出口地址對(duì)應(yīng)函數(shù)的IFDC信息;當(dāng)所述IFDC出口清單文件中存在所述調(diào)用出口地址時(shí)且所述IFDC出口清單文件對(duì)應(yīng)的目標(biāo)函數(shù)列表中不包括所述調(diào)用出口地址對(duì)應(yīng)函數(shù)時(shí),則在為所述調(diào)用出口地址對(duì)應(yīng)函數(shù)建立新的IFDC關(guān)系之后,記錄所述調(diào)用出口地址對(duì)應(yīng)函數(shù)的IFDC信息; 提取單元,用于當(dāng)所述可執(zhí)行程序運(yùn)行結(jié)束時(shí),提取出每個(gè)函數(shù)的IFDC信息,在程序目錄下生成所述IFDC記錄文件。
10.如權(quán)利要求5或6所述的系統(tǒng),其特征在于,所述函數(shù)調(diào)用關(guān)系獲得單元具體為解析單元,用于對(duì)所述EFC關(guān)系文件、所述IFSC關(guān)系文件及IFDC記錄文件進(jìn)行解析,獲得所述可執(zhí)行程序中模塊間的函數(shù)調(diào)用關(guān)系表。
全文摘要
本發(fā)明公開了一種獲取程序中模塊間函數(shù)接口的方法和系統(tǒng),其中,獲取程序中模塊間函數(shù)接口的方法用于實(shí)現(xiàn)自動(dòng)對(duì)模塊間函數(shù)接口進(jìn)行獲取,包括如下步驟通過靜態(tài)掃描所述可執(zhí)行程序,生成內(nèi)部函數(shù)靜態(tài)調(diào)用IFSC關(guān)系文件、外部函數(shù)調(diào)用EFC關(guān)系文件,及內(nèi)部函數(shù)動(dòng)態(tài)調(diào)用IFDC出口清單文件;在運(yùn)行所述可執(zhí)行程序時(shí),基于所述IFDC出口清單文件,生成IFDC記錄文件;基于所述EFC關(guān)系文件、所述IFSC關(guān)系文件及IFDC記錄文件,獲得所述可執(zhí)行程序中模塊間的函數(shù)調(diào)用關(guān)系表。
文檔編號(hào)G06F9/44GK103019663SQ201110287958
公開日2013年4月3日 申請(qǐng)日期2011年9月26日 優(yōu)先權(quán)日2011年9月26日
發(fā)明者蔣嵩 申請(qǐng)人:中興通訊股份有限公司