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