專利名稱::在ARM處理器上實(shí)現(xiàn)Wine構(gòu)建工具移植的方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及軟件移植領(lǐng)域,尤其涉及在ARM處理器上實(shí)現(xiàn)Wine構(gòu)建工具移植的方法。
背景技術(shù):
:以手機(jī)為代表的智能化移動終端設(shè)備既是計算機(jī)技術(shù)的一個重要發(fā)展方向,又是一個競爭十分激烈的市場。自從谷歌公司和開放手機(jī)聯(lián)盟推出安卓(Android)操作系統(tǒng)和基于Android的手機(jī)以來,很快就在世界手機(jī)市場上占有了不小的份額,各種Android手機(jī)層出不窮。中國移動開發(fā)并推出的OPhone(0MS智能手機(jī))也是基于Android的手機(jī)。所謂Android操作系統(tǒng),實(shí)際上是對Linux操作系統(tǒng)的一種改編和擴(kuò)充,它的內(nèi)核基本上就是Linux的內(nèi)核,但是在用戶空間卻專門針對手機(jī)和移動終端設(shè)備的特點(diǎn)作了大幅的改進(jìn)和增強(qiáng),這些改動大都與編程模式和圖形界面,即圖形化用戶界面(GUI)有關(guān)。另一種常用于手機(jī)的操作系統(tǒng)是微軟的WinCE和WM(即WindowsMobile),這是在微軟的Windows操作系統(tǒng)上發(fā)展起來的?;赪inCE/WM的手機(jī)也在市場上占不小的份額,并且開發(fā)出了數(shù)量不小的WinCE/WM應(yīng)用軟件。如果能把這些應(yīng)用軟件拿到OMS智能手機(jī)上運(yùn)行,對于提高OMS智能手機(jī)的市場占有率顯然是有利的。為了能把WinCE/WM應(yīng)用軟件移植到OMS智能手機(jī)上運(yùn)行,需要把開源軟件Wine移植到OMS手機(jī)上,把本應(yīng)由Windows提供的支撐嫁接到Linux上,并對其加以擴(kuò)充、使其支持WinCE/WM,可以讓W(xué)inCE/WM應(yīng)用軟件直接在OMS手機(jī)上運(yùn)行(實(shí)際上是在OMS手機(jī)的Linux內(nèi)核上運(yùn)行)。這樣,原來熟悉WinCE/WM軟件開發(fā)的人就可以按原來的模式、在原來的開發(fā)環(huán)境中、使用原來的開發(fā)工具、像開發(fā)WinCE/WM軟件一樣地開發(fā)OMS軟件,而且開發(fā)出來的軟件既是WinCE/WM軟件又可以在OMS手機(jī)上運(yùn)行,這對于開發(fā)者也是很有利的??墒牵琌MS手機(jī)是基于ARM處理器的手機(jī)平臺。然而,目前的Wine主要是面向x86系統(tǒng)結(jié)構(gòu)微處理器的,雖然也支持PoWerPC、Sparc等別的微處理器,但是卻不支持ARM。因此,想要在OMS智能手機(jī)上運(yùn)行Wine,需要對Wine軟件移植到ARM處理器上。
發(fā)明內(nèi)容針對現(xiàn)有技術(shù)中存在的上述問題,本發(fā)明提供了在ARM處理器上實(shí)現(xiàn)Wine構(gòu)建工具移植的方法,實(shí)現(xiàn)Wine的移植。本發(fā)明提供了在ARM處理器上實(shí)現(xiàn)Wine構(gòu)建工具移植的方法,包括步驟1,修改Wine的配置工具,以使用arm-linux的交叉編譯器和arm-linux的庫文件來替換X86平臺下的gcc編譯器和庫;步驟2,修改Wine的構(gòu)建工具,以將Windows目標(biāo)應(yīng)用程序生成對應(yīng)于ARM處理器的PE格式映像;步驟3,修改Wine中的其他與CPU相關(guān)的代碼,使得所有Wine的代碼適用于ARM處理器;步驟4,將修改后的Wine源代碼安裝到ARM處理器上。在一個示例中,步驟1中,所述配置工具包括Configure文件、Configure,ac文件、Make,rules文件和Makefile文件。在一個示例中,所述構(gòu)建工具包括Winegcc工具和WinebuiId工具。在一個示例中,Winegcc工具的函數(shù)get_translator()能夠識另Ijarm-Iinux的交叉編譯器。在一個示例中,Winebuild工具用于生成PE可執(zhí)行映像的頭部及其各個段,以及為每個PE格式的可執(zhí)行映像生成用于ARM處理器上裝載的PE頭部和除代碼段和數(shù)據(jù)段之外的各個段的映像。在一個示例中,啟動Winebuild的命令行中具有選擇項(xiàng)“一save-temps”,以保存用于動態(tài)連接庫的匯編代碼。在一個示例中,步驟3中,將wine_call_on_stack()和wine_switch_to_stack()用ARM匯編語句實(shí)現(xiàn);增加文件signal_arm.c,用于實(shí)現(xiàn)對ARM的CONTEXT數(shù)據(jù)結(jié)構(gòu)操作;對函數(shù)copy_context()擴(kuò)充針對ARMCONTEXT的代碼;增加文件context_arm.c,用于針對ARM處理器實(shí)現(xiàn)文件context_i386.c的功能;在kernel32/process.c中增加識別參數(shù)IMAGE_FILE_MACHINE_ARM和IMAGE_FILE_MACHINE_THUMB的功能;修改函數(shù)ILGetSizeO和ILGetNext(),以在ARM處理器訪問內(nèi)存時對齊長字或字的邊界。本發(fā)明實(shí)現(xiàn)了Wine的移植,使Wine能夠在OMS智能手機(jī)上運(yùn)行。下面結(jié)合附圖來對本發(fā)明作進(jìn)一步詳細(xì)說明,其中圖1是Wine移植到ARM處理器的流程。具體實(shí)施例方式本發(fā)明提供了在ARM處理器上實(shí)現(xiàn)Wine構(gòu)建工具移植的方法。在用本發(fā)明的方法移植后,Wine工具能夠正確移植到ARM處理器上,因此可以使基于ARM處理器的OMS智能操作系統(tǒng)運(yùn)行Wine工具,進(jìn)一步可以在此基礎(chǔ)上把WinCE/WM應(yīng)用軟件移植到OMS智能操作系統(tǒng)中。為了把Wine工具正確移植到ARM處理器上,本發(fā)明的方案是。在特定處理器上構(gòu)建Wine時,先需要進(jìn)行配置工作。因此,本發(fā)明首先針對ARM處理器對Wine開源軟件的配置工具進(jìn)行擴(kuò)充和移植,才能編譯/匯編/連接出運(yùn)行于ARM的二進(jìn)制代碼。其次,在ARM處理器上構(gòu)建Wine時,除ARM工具鏈以外,Wine的構(gòu)建(編譯、匯編、連接)還需要ffinegcc,ffinebuild,Widl,Wrc和Wmc這5個Wine構(gòu)建工具的參與,本方案需要對其中的Winegcc和Winebuild針對ARM處理器進(jìn)行修改/移植。本發(fā)明中,將Wine工具正確移植到ARM處理器上的流程如圖1所示,主要包括六個步驟,首先要下載Wine開源軟件源碼并解壓縮;然后運(yùn)行./configure,通過此命令對Wine進(jìn)行配置;第三步需要對Wine的配置工具進(jìn)行修改,以增加對ARM處理器的支持;第四步需要對Wine的構(gòu)建工具進(jìn)行修改,以增加對ARM處理器的支持;第五步,修改移植Wine中的其他與CPU相關(guān)的代碼,以增加對ARM處理器的支持;最后一步把修改好的源碼移植到ARM處理器上編譯安裝。當(dāng)然在安裝過程中可能會出現(xiàn)一些錯誤,需要根據(jù)實(shí)際情況進(jìn)行調(diào)試。下面詳細(xì)對每個步驟進(jìn)行說明。第一步下載Wine開源軟件源碼并解壓縮??梢詮拈_源Wine工程網(wǎng)站http://www.winehq.org/下載Wine源碼到X86平臺下的Linux操作系統(tǒng)上,本實(shí)施例中Wine源碼版本為Wine-L3.13,平臺為htelXeonCPUE531001.60GHz,Linux操作系統(tǒng)為Unbuntu10.4版本。然后解壓到本地文件夾,解壓命令為tar-jxvfwine-1.3.13.tar.bz2。第二步運(yùn)行./configure,通過此命令對Wine進(jìn)行配置,它會針對各種不同的CPU生成相應(yīng)的編譯器選項(xiàng),并決定某些源文件的取舍。目前的Wine支持x86、PowerPC,Sparc.Apple等處理器,通過系統(tǒng)配置,就可以使編譯/匯編/連接工具產(chǎn)生出針對具體處理器的二進(jìn)制可執(zhí)行代碼。然而,目前的Wine并不支持ARM。所以,要將Wine移植到ARM處理器上,首先就要對其配置工具加以擴(kuò)充和移植。這樣,結(jié)合對有關(guān)代碼、特別是匯編代碼的移植,才能編譯/匯編/連接出運(yùn)行于ARM的二進(jìn)制代碼。第三步對Wine的配置工具進(jìn)行修改,本發(fā)明的方法具體需要修改的地方為Configure文件、Configure,ac文件、Make,rules文件禾口Makefile文件,其中ConfigureJC件和Configure,ac文件本來就存在,而Make,rules文件和Makefile文件是./configure命令運(yùn)行的產(chǎn)物。比如在Makefile文件需要修改的地方為CC=arm-linux-gccCFLAGS=-g-00_D_arm_AR=arm-linux-arRANLIB=arm-linux-ranlibSTRIP=arm-linux-stripT00LSDIR=/tinyx/wine-tools/AS=arm-linux-asLD=arm-linux-ldLINTFLAGS=-D_arm_上述修改通過使用arm-linux的交叉編譯器和arm-linux的庫文件來替換原來的X86平臺下的gcc編譯器和庫,從而提供了ARM處理器的支持。第四步需要對Wine的構(gòu)建工具進(jìn)行修改。由于Wine通過裝載和啟動PE格式映像來間接運(yùn)行Windows目標(biāo)應(yīng)用程序,因此此處對構(gòu)建工具的修改,目標(biāo)是把一個Windows目標(biāo)應(yīng)用程序生成對應(yīng)于ARM處理器的PE格式映像。在ARM處理器上構(gòu)建Wine時,除ARM工具鏈以外,Wine的構(gòu)建(編譯、匯編、連接)還需要一些Wine(構(gòu)建)工具的參與,這些工具有Winegcc按MinGW的方式使用gccWinebuild生成PE可執(zhí)行映像的頭部及其各個段,為每個PE格式的可執(zhí)行映像(ΕΧΕ或DLL)生成用于ARM處理器上裝載的PE頭部和各個段(除代碼段、數(shù)據(jù)段外)的映像WidlCOM插件接口的IDLCompilerWrcWin32ResourceCompilerffmcWineMessageCompiler其中,我們需要對Winegcc和Winebuild工具針對ARM處理器進(jìn)行修改/移植。對Winegcc的修改主要是使原來調(diào)用標(biāo)準(zhǔn)編譯器的地方改成調(diào)用交叉編譯器。需要修改的有g(shù)et_translat0r()和build()兩個函數(shù)。這兩個函數(shù)都需要對編譯器進(jìn)行識別,以決定使用哪個版本的編譯器,因此在這里需要分別增加對arm-linux交叉編譯器的識別,允許使用ARM平臺上的交叉編譯器,從而增加了對ARM平臺的支持。Winebuild是個關(guān)鍵性的工具。它的作用是為每個PE格式的可執(zhí)行映像(ΕΧΕ或DLL)生成PE頭部和各個段(除代碼段、數(shù)據(jù)段外)的映像,包括用于動態(tài)連接的函數(shù)跳轉(zhuǎn)表等等。這部分映像中包含了一些匯編程序,需要加以移植。Winebuild的修改是難度最大的,大部分需要移植的匯編程序都在這里。對Winebuild工具的修改具體包括staticvoidoutput_import_thunk(constchar氺name,constcharitable,intpos);staticvoidoutput_delayed_import_thunks(constDLLSPEC^spec);staticvoidoutput—asm—constructor(constchar氺constructor)禾口voidBuildSpec32File(DLLSPEC^spec)函數(shù)。由于其作用類似,我們僅以staticvoidoutput_import_thunk(constchar^name,constcharitable,intpos)函數(shù)為例進(jìn)行詳細(xì)分析。Wine所支持的處理器類型原來有CPU_x86、CPU_x8664、CPU_SPARC、CPU_ALPHA、和CPU_P0WERPC,現(xiàn)在需要增加一種新的類型CPU_ARM。這是在build,h中定義的enumtarget—cpu{CPU—x86,CPU—x86—64,CPU—SPARC,CPU—ALPHA,CPU—POWERPC,CPU_ARM/*CPUARMaddedforARMprocessors,byInsigma*/};然后,要把main,c中的全局變量target_cpu設(shè)置成CPU_ARM。#elifdefined(_powerpc_)enumtarget_cputarget_cpu=CPU_P0WERPC;#elifdefined(_used_by_arm_)||defined(_arm_)/^AddedforARMprocessors,byInsigma*/enumtarget_cputarget_cpu=CPU—ARM;這里的條件編譯控制_11%(0^_虹111_或_虹111_是由配置工具Configure自動產(chǎn)生的。需要移植的匯編代碼主要在源文件import,c和speC32.c中。其中的一個函數(shù)是output_import_thunk()staticvoidoutput_import_thunk(constchar*name,constchar*table,intpos){~~output("\n\t.align%d\n",get—alignment(4));output("\t%s\n",funcdeclaration(name));output("%s\n",asm—globl(name));switch(targetcpu){caseCPU—x86:if(IUsePIC){output("\tjmp*(%s+%d)\n",table,pos);}else{output("\tcall%s\n",asm—name('’—wine_spec_get_pc_thunk_eax"));output("l:\tjmp*%s+%d-1b(%%eax)\n",table,pos);}break;caseCPU—ARM:/*TBDforARMprocessors,byInsigma*/output("/*output—import—thunk()forARM*An");output("\t/*originalcodefori386:*An");output("\t\t\t/*call%s*An",asm—name("—wine_spec_get_pc_thunk_eax"));output(“\t\t\t\t/*getaddressofnextinstruction*/\n");output("\t/*l:\tjmp*%s+%d-1b(%%eax)*An",table,pos);output("\t\t\t\t/*%s+%d-lbistheoffset*An",table,pos);output("\t/*codeforARM:*An");output(”Vtstmfdsp!,{r6}/*saver6instack*An");output("\tldr%%r6,.pos_%s\n",name);//output("\tldr%%r7,.Ljmp_%s\n",name);output("\tadr%%ip,.jmp_%s\n",name);output("\tsub%%ip,%%ip,%%r6/*distancebetweenthe2labelsW’);output("\tldmfdsp!,{r6}/*restorer6instack*An");output("\tsub%%ip,%%pc,%%ip/*pc=.+8,namely.jmp_%s*Λη",name);output("\tldr%%ip,[%%ip,#0]/*getthefuncpointer*An");output(".jmp_%s:\tbx%%ip\n\n",name);output(".pos_%s:\n",name);output("\t.word%s+%d\n\n",table,pos);//output(".Ljmp_%s:\n",name);//output("\t.word.jmp_%s\n\n",name);output(7*endforARM*/\n");break;output—function—size(name);}這個函數(shù)生成出一些用于DLL動態(tài)連接的匯編代碼。對于ARM處理器,代碼中先以注釋的形式列出原始的x86指令,然后是與這些x86指令等價的ARM指令。Winebuild在運(yùn)行時將這些代碼寫入一個臨時文件,文件名隨機(jī)生成,后綴為“.S”。經(jīng)過匯編、連接之后,這些代碼就進(jìn)入了目標(biāo)可執(zhí)行映像(例如uSer32.dll),然后,這個臨時文件就被刪除了。所以,對于程序員來說,這些匯編代碼是不可見的。不過也可以在啟動winebuild的命令行中加用一個選擇項(xiàng)“一save-temps”,這樣winebuild就不會刪除所生成的臨時文件。下面幾個函數(shù)的作用與此相似,只是所生成的代碼作用不同,包括staticvoidoutput_delayed_import_thunks(constDLLSPEOspec);staticvoidoutput—asm—constructor(constchar水constructor),它用于生成“.init”段的代碼;voidBuildSpec32FiIe(DLLSPEOspec),這個函數(shù)與PE頭部和導(dǎo)出函數(shù)跳轉(zhuǎn)表有關(guān)·上面這些函數(shù)實(shí)現(xiàn)了目標(biāo)可執(zhí)行映像的函數(shù)導(dǎo)出和導(dǎo)入,也提供了映像的PE頭部。對于PE格式的可執(zhí)行映像,這些代碼是至關(guān)重要的。第五步,修改移植Wine中的其他與CPU相關(guān)的代碼。首先,Wine代碼中的有些片段是以匯編指令寫成的,由于所有匯編指令都與處理器相關(guān),因此要把這些片段改寫成ARM的匯編指令,除了第三步中涉及的幾個片段外,還有Wine_call_on_stack()和Wine_switch_to_stack()兩個函數(shù)也是用匯編指令寫成的,這兩個函數(shù)在wine/libs/wine/port,c中,我們需要把函數(shù)中對棧的相關(guān)操作用ARM匯編語句實(shí)現(xiàn)。不同的CPU具有不同的寄存器集合,所以它們的CONTEXT數(shù)據(jù)結(jié)構(gòu)也不同,Wine原來不支持ARM,但是wirmt.h中卻提供了ARM的CONTEXT數(shù)據(jù)結(jié)構(gòu)定義。雖然winnt.h提供了ARM的CONTEXT數(shù)據(jù)結(jié)構(gòu)定義,Wine的代碼中卻并不提供有關(guān)的代碼,需要加以補(bǔ)充,具體包括1.在目錄dlls/ntdll下提供一個名為signal_arm.c的文件,作為signal_i386.c的替代,實(shí)現(xiàn)里面的一些函數(shù),例如saVe_context()、restore_context()等等,其作用是實(shí)現(xiàn)對ARM的CONTEXT數(shù)據(jù)結(jié)構(gòu)操作。2.在dlls/ntdll/thread.c中有個函數(shù)copy_context0,需要擴(kuò)充針對ARMCONTEXT的代碼。3.在WineServer的代碼中,需要在目錄server下面提供一個名為context_arm.c的文件,作為context」386.c的替代,實(shí)現(xiàn)里面的一些函數(shù),例如copy_context()、get_context_ip()等等(注意WineServer和Ntdll中各有一個copy_context(),并非同一個函數(shù))。context_arm.c文件的作用與context_i386.c類似,但是它是針對ARM處理器的一個實(shí)現(xiàn)。但是這還不是事情的全部,還有些代碼并非匯編指令,但是也與具體的CPU有關(guān)。首先,可執(zhí)行映像的PE頭部有個字段,說明這是針對哪一種CPU的可執(zhí)行映像。對于x86處理器,這個字段的值是IMAGE_FILE_MACHINE_I386、即OxOHc。而對于ARM處理器則有兩種可能,即IMAGE_FILE_MACHINE_ARM和IMAGE_FILE_MACHINE_THUMB,這兩個常數(shù)的值分別是OxOIcO和0x01c2。原來的Wine不認(rèn)識這兩個“簽名”,所以不能裝載/運(yùn)行ARM的可執(zhí)行映像。現(xiàn)在要用到這兩個常數(shù),需要在kerne132/pr0cess.c中增加對這兩個“簽名”的識別功能。還有個特殊的問題,是與文件操作和COM有關(guān)的。在wine/include/shtypes.idl中定義了一種數(shù)據(jù)結(jié)構(gòu)ITEMIDLISTtypedefstructITEMIDLISTSHITEMIDmkid;/*firstitemidinlist*/}ITEMIDLIST,*LPITEMIDLIST;而SHITEMID則定義為typedefstruct{WORDcb;/*nrofbytesinthisitem*/BYTEabID[l];/*firstbyteinthisitem*/}SHITEMID,*LPSHITEMID;這里數(shù)組abID[]的大小可變,其大小記錄在字段cb中,這個數(shù)組用來存放文件名。當(dāng)文件名的長度為奇數(shù)時,數(shù)據(jù)結(jié)構(gòu)SHITEMID、從而ITEMIDLIST的大小也是奇數(shù),因而不與長字或字的邊界對齊。在實(shí)際使用中,好幾個SHITEMID數(shù)據(jù)結(jié)構(gòu)會首尾相連疊在一起,形成一個列表。這樣,如果第一個SHITEMID數(shù)據(jù)結(jié)構(gòu)的大小是奇數(shù),第二個SHITEMID數(shù)據(jù)結(jié)構(gòu)的起點(diǎn)就不與長字或字的邊界對齊了。對于x86處理器,這是允許的,不會造成問題。但是,對于ARM,這就不允許了,ARM只允許與長字或字邊界對齊的內(nèi)存訪問(除非訪問的對象是字節(jié)),否則就不保證操作的正確性。由于這個原因,當(dāng)CPU從第二個SHITEMID數(shù)據(jù)結(jié)構(gòu)中讀取其cb字段的數(shù)值時,所得到的可能是個錯誤的數(shù)值,從而誤認(rèn)為第二個SHITEMID數(shù)據(jù)結(jié)構(gòu)中的abID[]很大,因而造成問題。為了解決這個問題,需要對有關(guān)的函數(shù)ILGetSize()、ILGetNext()作修改,需要修改實(shí)現(xiàn)的功能為在只有一個獨(dú)立的SHITEMID數(shù)據(jù)結(jié)構(gòu)時,這個函數(shù)返回的數(shù)據(jù)結(jié)構(gòu)長度不是cb字段本身的數(shù)值,而是經(jīng)過_insigma_align()調(diào)整的數(shù)值。_insigma_align()函數(shù)定義如下#ifdef—Insigma—WORD—insigma—align(WORDχ)if(x%2)returnχ+1;}returnχ;}#endif就是說,如果abID[]的大小為奇數(shù)的話,就在此數(shù)值上加1,使其與長字或字的邊界對齊。這樣,在一個列表中,每一個SHITEMID數(shù)據(jù)結(jié)構(gòu)的起點(diǎn)就都是與長字或字的邊界對齊的。這就解決了ARM處理器訪問內(nèi)存時邊界必須對齊的問題。從原理上說,這個問題的解決還有另一種方法,就是把SHITEMID數(shù)據(jù)結(jié)構(gòu)中字段cb的類型改成BYTE(而不是WORD)。但是原來之所以定義為WORD—定有其考慮(例如文件名的長度可能超過255個字節(jié)),所以不宜作這樣的修改。第六步把修改后的Wine源文件移植到ARM處理器上,實(shí)際上就是把源文件拷貝過去,本實(shí)施例中ARM處理器平臺為基于ARM處理器的OMS操作系統(tǒng)??截愅瓿珊筮\(yùn)行makeinstall命令,此命令將自動在ARM處理器上進(jìn)行編譯安裝,如果該命令能正確運(yùn)行,則表示W(wǎng)ine已經(jīng)成功移植到ARM處理器上;否則,需要按照命令出錯情況進(jìn)行debug。實(shí)際上,本實(shí)施例在在調(diào)試中發(fā)現(xiàn)了GCC編譯器3.4版本的1個BUG,就是計算2個標(biāo)號地址的相對量出現(xiàn)錯誤,后改用GCC4.0版本就正確。改用gcc4.0后,winebuild在調(diào)用arm-linux-as時候需要增加_mfpu=vfp選項(xiàng)。另外,在調(diào)試中發(fā)現(xiàn)一個DLL調(diào)用另外一個DLL中的函數(shù)時出現(xiàn)錯誤,原因是編譯器優(yōu)化的緣故,將命令行參數(shù)-02改成-00,不讓優(yōu)化就解決了問題。以上所述僅為本發(fā)明的優(yōu)選實(shí)施方式,但本發(fā)明保護(hù)范圍并不局限于此。任何本領(lǐng)域的技術(shù)人員在本發(fā)明公開的技術(shù)范圍內(nèi),均可對其進(jìn)行適當(dāng)?shù)母淖兓蜃兓?,而這種改變或變化都應(yīng)涵蓋在本發(fā)明的保護(hù)范圍之內(nèi)。權(quán)利要求1.在ARM處理器上實(shí)現(xiàn)Wine構(gòu)建工具移植的方法,其特征在于,包括步驟1,修改Wine的配置工具,以使用arm-linux的交叉編譯器和arm-linux的庫文件來替換X86平臺下的gcc編譯器和庫;步驟2,修改Wine的構(gòu)建工具,以將Windows目標(biāo)應(yīng)用程序生成對應(yīng)于ARM處理器的PE格式映像;步驟3,修改Wine中的其他與CPU相關(guān)的代碼,使得所有Wine的代碼適用于ARM處理器;步驟4,將修改后的Wine源代碼安裝到ARM處理器上。2.如權(quán)利要求1所述的方法,其特征在于,步驟1中,所述配置工具包括Configure文件、Configure,ac文件、Make,rules文件和Makefile文件。3.如權(quán)利要求2所述的方法,其特征在于,所述構(gòu)建工具包括Winegcc工具和Winebuild工具。4.如權(quán)利要求3所述的方法,其特征在于,Winegcc工具的函數(shù)getJranslatorO能夠識別arm-linux的交叉編譯器。5.如權(quán)利要求4所述的方法,其特征在于,Winebuild工具用于生成PE可執(zhí)行映像的頭部及其各個段,以及為每個PE格式的可執(zhí)行映像生成用于ARM處理器上裝載的PE頭部和除代碼段和數(shù)據(jù)段之外的各個段的映像。6.如權(quán)利要求5所述的方法,其特征在于,啟動Winebuild的命令行中具有選擇項(xiàng)“-save-temps",以保存用于動態(tài)連接庫的匯編代碼。7.如權(quán)利要求5所述的方法,其特征在于,步驟3中,將Wine_call_on_stack()和wine_switch_to_stack()用ARM匯編語句實(shí)現(xiàn);增加文件signal_arm.c,用于實(shí)現(xiàn)對ARM的CONTEXT數(shù)據(jù)結(jié)構(gòu)操作;對函數(shù)copy_context()擴(kuò)充針對ARMCONTEXT的代碼;增加文件context_arm.c,用于針對ARM處理器實(shí)現(xiàn)文件context_i386.c的功能;在kernel32/process,c中增加識別參數(shù)IMAGE_FILE_MACHINE_ARM和IMAGE_FILE_MACHINE_THUMB的功能;修改函數(shù)ILGetSize()和ILGetNext(),以在ARM處理器訪問內(nèi)存時對齊長字或字的邊界。全文摘要本發(fā)明公開了在ARM處理器上實(shí)現(xiàn)Wine構(gòu)建工具移植的方法,包括步驟1,修改Wine的配置工具,以使用arm-linux的交叉編譯器和arm-linux的庫文件來替換X86平臺下的gcc編譯器和庫;步驟2,修改Wine的構(gòu)建工具,以將Windows目標(biāo)應(yīng)用程序生成對應(yīng)于ARM處理器的PE格式映像;步驟3,修改Wine中的其他與CPU相關(guān)的代碼,使得所有Wine的代碼適用于ARM處理器;步驟4,將修改后的Wine源代碼安裝到ARM處理器上。本發(fā)明實(shí)現(xiàn)了Wine的移植,使Wine能夠在OMS智能手機(jī)上運(yùn)行。文檔編號G06F9/44GK102364433SQ201110173679公開日2012年2月29日申請日期2011年6月24日優(yōu)先權(quán)日2011年6月24日發(fā)明者徐鼎鼎,毛德操,王承志,陳天洲,馬建良申請人:浙大網(wǎng)新科技股份有限公司