陳 鵬,陳麗容,高艷鹍,李洪波
(1.中國航天科工集團(tuán)第二研究院 北京計(jì)算機(jī)技術(shù)及應(yīng)用研究所,北京 100854;2.73658部隊(duì) 信息技術(shù)中心,北京 239400)
隨著我國操作系統(tǒng)技術(shù)的迅猛發(fā)展,對其進(jìn)行兼容性測試一直是一個(gè)亟需解決的問題[1]。目前對操作系統(tǒng)進(jìn)行兼容性測試主要是判斷其實(shí)現(xiàn)是否符合國際標(biāo)準(zhǔn)LSB[2]或者POSIX[3]。然而目前國產(chǎn)操作系統(tǒng)廠商眾多,如中標(biāo)、普華、麒麟等操作系統(tǒng)都存在著大量的用戶群體,并且操作系統(tǒng)廠商都有著各自的開發(fā)標(biāo)準(zhǔn)并且各開發(fā)標(biāo)準(zhǔn)存在著較大的差異,導(dǎo)致國產(chǎn)操作系統(tǒng)難以形成統(tǒng)一的開發(fā)標(biāo)準(zhǔn);另外操作系統(tǒng)開發(fā)廠商經(jīng)常各自適配不同的第三方庫,導(dǎo)致標(biāo)準(zhǔn)符合性的測試方法無法解決當(dāng)前的全部需求[4]。許侃等曾提出通過編寫測試腳本在整機(jī)上運(yùn)行來測試操作系統(tǒng)整機(jī)兼容性的方法,測試了硬件在操作系統(tǒng)上的運(yùn)行性能以及穩(wěn)定性[5]。在其它操作系統(tǒng)領(lǐng)域,任海鵬等曾提出利用安卓原生CTS測試包以及人機(jī)交互界面的Android操作系統(tǒng)兼容性測試技術(shù),提升了兼容性測試的自動(dòng)化能力[6]。另外,張曉敏提出針對軟件功能設(shè)計(jì)測試環(huán)境及用例,測試軟件在操作系統(tǒng)中運(yùn)行效率的測試方法[7]。本文吸取前人將操作系統(tǒng)與軟硬件結(jié)合測試的經(jīng)驗(yàn),從操作系統(tǒng)兼容性概念著手,對應(yīng)用程序在操作系統(tǒng)中運(yùn)行的原理進(jìn)行分析,提出了一種基于依賴要素比對的國產(chǎn)操作系統(tǒng)兼容性測試方法,并利用相關(guān)實(shí)驗(yàn)驗(yàn)證了該方法的可行性。
本文對操作系統(tǒng)兼容性的概念進(jìn)行分析,了解到操作系統(tǒng)的兼容性測試可以引申到應(yīng)用程序在操作系統(tǒng)中的運(yùn)行情況,進(jìn)而對應(yīng)用程序在操作系統(tǒng)中運(yùn)行的原理進(jìn)行解析,了解到應(yīng)用程序在操作系統(tǒng)中運(yùn)行需要對操作系統(tǒng)提供的庫函數(shù)進(jìn)行調(diào)用,而對庫函數(shù)的調(diào)用又依賴于操作系統(tǒng)提供準(zhǔn)確的庫函數(shù)簽名。進(jìn)而明確了通過比對庫函數(shù)得到操作系統(tǒng)兼容性測試結(jié)果的方法。
通過對ELF文件格式進(jìn)行分析,明確操作系統(tǒng)內(nèi)可執(zhí)行程序以及庫文件都是以ELF文件格式保存的,并且ELF文件格式中保存了庫文件的各種信息以及庫文件所包含的庫函數(shù)的信息,進(jìn)而找到了基于對ELF文件格式進(jìn)行分析得到操作系統(tǒng)兼容性依賴要素的方法。
最后通過上述兩點(diǎn)的分析,明確了操作系統(tǒng)兼容性依賴要素并對依賴要素進(jìn)行了分級。
另外,由源代碼到可執(zhí)行程序的過程需要經(jīng)過編譯器、連接器等工具的配合工作才能實(shí)現(xiàn),考慮到編譯器等工具并非操作系統(tǒng)提供的工具,為不可控因素,故在本文提供的兼容性測試方法中默認(rèn)庫函數(shù)的編譯由同一類編譯器、連接器進(jìn)行,進(jìn)而排除編譯器等對可執(zhí)行代碼的影響。
操作系統(tǒng)兼容性是指在一個(gè)操作系統(tǒng)上面開發(fā)的應(yīng)用程序可以不加修改、不用編譯直接運(yùn)行于另外一個(gè)操作系統(tǒng)上的特性[8]。我們把前者稱為當(dāng)前操作系統(tǒng),把后者稱為目標(biāo)操作系統(tǒng)。程序在操作系統(tǒng)中轉(zhuǎn)變?yōu)榭蓤?zhí)行文件需要經(jīng)歷4個(gè)步驟:預(yù)編譯、編譯、匯編以及鏈接。前3個(gè)步驟是對程序本身進(jìn)行分析,將程序翻譯為機(jī)器可以執(zhí)行的指令的過程;鏈接是一個(gè)重定位的過程,當(dāng)指令內(nèi)涉及某個(gè)符號時(shí),需要從操作系統(tǒng)或者程序本身找到這些符號,將目標(biāo)在系統(tǒng)中的地址填入指令中,這個(gè)過程就是鏈接。鏈接分為靜態(tài)鏈接與動(dòng)態(tài)鏈接兩種,其中靜態(tài)鏈接是將多個(gè)文件組合成一個(gè)可執(zhí)行程序的過程,動(dòng)態(tài)鏈接則是對系統(tǒng)庫文件進(jìn)行查詢,找到程序調(diào)用的庫函數(shù)的地址進(jìn)行重定位的過程。通過以上分析可以知道,程序在操作系統(tǒng)上的運(yùn)行涉及到對系統(tǒng)庫函數(shù)的調(diào)用,因此本文找到當(dāng)前操作系統(tǒng)以及目標(biāo)操作系統(tǒng)的庫文件和庫函數(shù),對兩操作系統(tǒng)依賴要素進(jìn)行比對,根據(jù)比對結(jié)果判斷操作系統(tǒng)兼容性。
ELF(executable and linkable format)是UNIX系統(tǒng)實(shí)驗(yàn)室(USL)作為應(yīng)用程序二進(jìn)制接口(application binary interface,ABI)而開發(fā)和發(fā)布的,也是Linux的主要可執(zhí)行文件格式[9]。它保存了程序編譯以及執(zhí)行時(shí)的各種相關(guān)信息(如文件名、文件絕對路徑、版本號、代碼段、數(shù)據(jù)段、.bss段等)。
ELF一個(gè)特別的優(yōu)點(diǎn)在于同一文件格式可以用于Linux內(nèi)核支持的幾乎所有的體系結(jié)構(gòu)上。該格式標(biāo)準(zhǔn)不僅用于用戶空間應(yīng)用程序和庫文件,還用于構(gòu)建模塊,且內(nèi)核本身也是ELF格式。ELF文件格式包括文件頭(ELF header)、程序頭(program header table)、節(jié)頭表(section header table)以及各個(gè)段(sections)[10]。表1給出了ELF文件格式的一些字段及其含義。
可以看出ELF文件頭中保存著各個(gè)段的起始地址以及長度,通過地址以及長度可以計(jì)算出各個(gè)段的地址范圍;.text段保存著程序以及庫文件的代碼段,通過對.text段進(jìn)行解析,就可以得到庫文件包含的所有庫函數(shù)的編譯信息;.symtab段保存著庫文件的符號表,其中包含符號的名稱、地址以及長度,通過判斷符號的地址是否在.text段的地址范圍內(nèi),就可以確定該符號是否是庫文件所包含的庫函數(shù)[11]。
程序能在操作系統(tǒng)中運(yùn)行主要依靠的是調(diào)用系統(tǒng)提供的庫函數(shù)[12],對庫函數(shù)的準(zhǔn)確調(diào)用又依賴于系統(tǒng)提供正確的庫函數(shù)簽名,考慮到程序依賴的多個(gè)庫函數(shù)可能存在于同一個(gè)庫文件中,操作系統(tǒng)兼容性依賴要素主要分為3級,分別為庫文件的.text段、庫函數(shù)對應(yīng)的.text段、庫函數(shù)簽名對應(yīng)的.text段,這里的函數(shù)簽名指函數(shù)的參數(shù)傳遞。
操作系統(tǒng)的升級往往伴隨著庫函數(shù)的修改,兩個(gè)不同類型的操作系統(tǒng)也必然存在著庫函數(shù)實(shí)現(xiàn)上的差異,為了保證用戶程序可以在不加修改的情況下在目標(biāo)操作系統(tǒng)中運(yùn)行,應(yīng)保證軟件在當(dāng)前和目標(biāo)操作系統(tǒng)中調(diào)用的庫函數(shù)的簽名相同,基于依賴要素比對(dependency function element comparison,DFEC)的兼容性測試方法基于該原則,對當(dāng)前和目標(biāo)操作系統(tǒng)在庫函數(shù)的實(shí)現(xiàn)層面進(jìn)行比對,并根據(jù)比對結(jié)果將兼容性測試報(bào)告反饋給用戶。
DFEC兼容性測試方法分為兩個(gè)過程:首先對當(dāng)前操作系統(tǒng)和目標(biāo)操作系統(tǒng)進(jìn)行庫文件掃描,獲取庫文件和庫函數(shù)的包含關(guān)系,搭建操作系統(tǒng)庫函數(shù)模型;之后根據(jù)搭建好的庫函數(shù)模型,對當(dāng)前和目標(biāo)操作系統(tǒng)進(jìn)行依賴要素的分級比對,得到兼容性測試結(jié)果。
在操作系統(tǒng)中,庫函數(shù)信息以二進(jìn)制碼的形式保存在庫文件中,掃描庫函數(shù)信息要先獲取操作系統(tǒng)的所有庫文件,而庫文件又以.so的后綴名保存在操作系統(tǒng)中,因此首先遍歷操作系統(tǒng)文件資源,獲取所有帶有.so后綴名的庫文件。這里的庫文件包括系統(tǒng)自帶的庫文件以及第三方庫文件。
找到了庫文件后,需要基于ELF文件格式對庫文件進(jìn)行掃描,獲取庫文件包含的庫函數(shù)信息,基于1.2節(jié)對ELF文件格式的介紹,ELF文件格式的.symtab段保存了文件的符號表,其中包含了符號的名稱、地址以及長度,為了保證提取的符號是庫文件包含的庫函數(shù),需要對符號表進(jìn)行篩選,ELF文件格式的函數(shù)信息保存在.text段中,另外在ELF的頭部表中保存著各個(gè)段的地址以及長度,從中取出text的起始地址和長度,就可以得到.text段的整段范圍,這樣,對.symtab段中的符號地址進(jìn)行范圍篩選就能得到所有在.text段中的符號,也就是庫函數(shù)。
在知道了庫函數(shù)的名稱、地址以及長度后,就可以從庫文件中讀出所有庫函數(shù)的信息,進(jìn)而對庫函數(shù)信息進(jìn)行解析,獲取每個(gè)庫函數(shù)對應(yīng)的.text段內(nèi)容以及庫函數(shù)簽名對應(yīng)的.text段內(nèi)容。掃描庫函數(shù)信息的流程如圖1所示。
圖1 掃描庫函數(shù)信息
從庫文件ELF格式中獲取的.text段內(nèi)與各依賴要素有關(guān)的部分實(shí)際上是一串二進(jìn)制數(shù),這些二進(jìn)制數(shù)對應(yīng)機(jī)器指令的機(jī)器碼,鑒于二進(jìn)制數(shù)過于冗長,并且對依賴要素的比對只需判斷兩操作系統(tǒng)下的依賴要素是否相同,不需要知道依賴要素的具體改動(dòng)情況,我們將獲取的二進(jìn)制數(shù)利用哈希算法轉(zhuǎn)換成哈希值,對兩操作系統(tǒng)下的依賴要素進(jìn)行哈希值比對,節(jié)省比對的時(shí)間。
構(gòu)建好庫函數(shù)模型后,依據(jù)分級好的操作系統(tǒng)兼容性依賴要素,以庫函數(shù)為單位對目標(biāo)和當(dāng)前操作系統(tǒng)進(jìn)行依賴要素比對。比對之前需要確認(rèn)在目標(biāo)操作系統(tǒng)中是否可以找到當(dāng)前操作系統(tǒng)提供的庫文件,在找不到庫文件的情況下,認(rèn)為目標(biāo)操作系統(tǒng)缺少需要的庫文件,不能兼容于當(dāng)前操作系統(tǒng)。
在找到所有的庫文件后,按照依賴要素分級,分別對當(dāng)前操作系統(tǒng)以及目標(biāo)操作系統(tǒng)中每一個(gè)庫文件.text段、庫文件下庫函數(shù)的.text段、庫函數(shù)簽名的.text段進(jìn)行逐級比對,如果比對過程中有庫文件的.text段一致,則認(rèn)為該庫文件下的所有庫函數(shù)未進(jìn)行修改,可以判定該庫文件下的所有依賴要素未影響操作系統(tǒng)的兼容性;如果庫文件的.text段不一致,則需要對該庫文件下的所有庫函數(shù)進(jìn)行之后的兩個(gè).text段的比對,若比對過程中某一級的.text段一致,則認(rèn)為庫函數(shù)未進(jìn)行對操作系統(tǒng)兼容性有影響的修改,判斷該庫函數(shù)的修改未影響操作系統(tǒng)兼容性。如果所有庫函數(shù)的修改都被判定為未影響操作系統(tǒng)兼容性,則認(rèn)為操作系統(tǒng)的修改沒有影響到程序的運(yùn)行,目標(biāo)操作系統(tǒng)兼容于當(dāng)前操作系統(tǒng);若對某個(gè)庫函數(shù)的比對過程中每一級依賴要素的比對結(jié)果都不一致,則認(rèn)為該庫函數(shù)的修改影響了程序的調(diào)用,對該庫函數(shù)進(jìn)行調(diào)用的應(yīng)用程序無法在目標(biāo)操作系統(tǒng)上正確運(yùn)行,目標(biāo)操作系統(tǒng)不能兼容于當(dāng)前操作系統(tǒng)。具體工作流程如圖2所示。
圖2 依賴要素分級比對流程
從2.3節(jié)中可以得到當(dāng)前操作系統(tǒng)和目標(biāo)操作系統(tǒng)的依賴要素比對結(jié)果,從依賴要素分級比對流程圖可以看出,依賴要素的比對結(jié)果決定著操作系統(tǒng)兼容性比對結(jié)果是兼容還是不兼容。對于比對結(jié)果是兼容的兩個(gè)操作系統(tǒng),證明在當(dāng)前操作系統(tǒng)下運(yùn)行的應(yīng)用程序可以不加修改地遷移到目標(biāo)操作系統(tǒng)中。對于比對結(jié)果是不兼容的操作系統(tǒng),在當(dāng)前操作系統(tǒng)下運(yùn)行的部分應(yīng)用程序?qū)δ繕?biāo)操作系統(tǒng)中導(dǎo)致兩操作系統(tǒng)不兼容的庫函數(shù)進(jìn)行了調(diào)用,因此無法直接遷移到目標(biāo)操作系統(tǒng)中,對這些應(yīng)用程序,DFEC兼容性測試方法對兩操作系統(tǒng)下比對結(jié)果不相同的依賴要素進(jìn)行標(biāo)紅顯示,為應(yīng)用程序設(shè)計(jì)廠商以及操作系統(tǒng)廠商提供修改建議。
為了驗(yàn)證方法的可行性,分別對利用同一套編譯工具的不同類型的操作系統(tǒng)和相同類型操作系統(tǒng)的不同版本的兼容性進(jìn)行測試,并根據(jù)應(yīng)用軟件的實(shí)際運(yùn)行情況驗(yàn)證測試結(jié)果的準(zhǔn)確性。
3.1.1 測試方案
當(dāng)前操作系統(tǒng):centos7
目標(biāo)操作系統(tǒng):deepin15.4
基于DFEC兼容性測試方法,對兩操作系統(tǒng)中包含的所有庫文件進(jìn)行掃描,獲得centos7操作系統(tǒng)和deepin15.4操作系統(tǒng)的庫函數(shù)依賴模型,對兩個(gè)操作系統(tǒng)的依賴要素進(jìn)行比對,根據(jù)比對結(jié)果給出centos7操作系統(tǒng)和deepin15.4操作系統(tǒng)的兼容性測試結(jié)果。
3.1.2 兼容性測試結(jié)果
對兩操作系統(tǒng)下的庫文件進(jìn)行掃描,比對庫文件中包含的庫函數(shù)信息。部分比對結(jié)果見表2。
在目標(biāo)操作系統(tǒng)中找到了部分當(dāng)前操作系統(tǒng)的庫文件,這些庫文件包含的庫函數(shù)在實(shí)現(xiàn)上與當(dāng)前操作系統(tǒng)不同,但在函數(shù)簽名部分的哈希值比對結(jié)果還是一致的,但由于有部分庫文件以及庫函數(shù)未在目標(biāo)操作系統(tǒng)下找到,判定對這些庫文件進(jìn)行調(diào)用的程序無法被移植到目標(biāo)操作系統(tǒng)下,目標(biāo)操作系統(tǒng)不能兼容于當(dāng)前操作系統(tǒng)。
3.1.3 應(yīng)用軟件運(yùn)行情況
選取dot工具對兼容性測試結(jié)果進(jìn)行驗(yàn)證,dot工具在centos下對libgvc.so.6和libcgraph.so.6進(jìn)行了調(diào)用,這兩個(gè)庫文件在deepin15.4中沒有被找到,因此dot工具應(yīng)該不能在deepin15.4下運(yùn)行。將dot工具移植到deepin下運(yùn)行,系統(tǒng)顯示“dot not found”,證明dot工具不能在deepin15.4操作系統(tǒng)下運(yùn)行,兼容性測試結(jié)果無誤。
表2 centos7和deepin15.4依賴要素比對結(jié)果
3.2.1 測試方案
當(dāng)前操作系統(tǒng):deepin15.4
目標(biāo)操作系統(tǒng):deepin15.9
基于DFEC兼容性測試方法,對兩操作系統(tǒng)中包含的所有庫文件進(jìn)行掃描,獲得deepin15.4操作系統(tǒng)和deepin15.9操作系統(tǒng)的庫函數(shù)依賴模型,對兩個(gè)操作系統(tǒng)的依賴要素進(jìn)行比對,根據(jù)比對結(jié)果給出deepin15.4操作系統(tǒng)和deepin15.9操作系統(tǒng)的兼容性測試結(jié)果。
3.2.2 兼容性測試結(jié)果
對兩操作系統(tǒng)下的庫文件進(jìn)行掃描,比對庫文件中包含的庫函數(shù)信息。部分比對結(jié)果見表3。
表3 deepin15.4和deepin15.9依賴要素比對結(jié)果
經(jīng)過掃描和比對發(fā)現(xiàn),deepin15.4下的5704個(gè)庫文件在deepin15.9下均存在,并且?guī)煳募墓V当葘Y(jié)果均一致,證明庫文件均未發(fā)生改變,因此判斷目標(biāo)操作系統(tǒng)兼容于當(dāng)前操作系統(tǒng)。
3.2.3 應(yīng)用軟件運(yùn)行情況
我們選取了包括Firefox瀏覽器、Google瀏覽器等常用軟件,結(jié)果這些軟件在兩操作系統(tǒng)下都可以正常運(yùn)行,證明了兩個(gè)操作系統(tǒng)具備良好的兼容性,與實(shí)驗(yàn)結(jié)果一致。
本文針對目前國產(chǎn)操作系統(tǒng)缺少兼容性測試方法的現(xiàn)狀,基于對操作系統(tǒng)兼容性概念以及動(dòng)態(tài)鏈接原理的研究,提出了一種基于依賴要素比對的國產(chǎn)操作系統(tǒng)兼容性測試方法。該方法對操作系統(tǒng)內(nèi)與兼容性有關(guān)的依賴要素進(jìn)行提取和分級比對,根據(jù)比對結(jié)果得到國產(chǎn)操作系統(tǒng)兼容性測試結(jié)果,并利實(shí)驗(yàn)數(shù)據(jù)驗(yàn)證了方法的可行性。結(jié)果表明,基于依賴要素比對的國產(chǎn)操作系統(tǒng)兼容性測試方法不僅對操作系統(tǒng)兼容性給出了測試結(jié)果,還對導(dǎo)致操作系統(tǒng)不兼容的問題進(jìn)行了定位,從而為國產(chǎn)Linux操作系統(tǒng)兼容性測試提供了研究方向和解決方案。