跨平臺目標(biāo)文件復(fù)用方法【專利摘要】本發(fā)明公開了一種跨平臺目標(biāo)文件復(fù)用方法,包括以下步驟:S1:讀取第一目標(biāo)文件,并解析其文件結(jié)構(gòu);S2:根據(jù)解析結(jié)果,將所述第一目標(biāo)文件以符號為單位,分解為各符號及其數(shù)據(jù)、重定位信息;S3:對第一目標(biāo)文件的符號名進(jìn)行更新處理;S4:按照第二目標(biāo)文件的文件格式將分解第一目標(biāo)文件得到的各符號及其數(shù)據(jù)、重定位信息構(gòu)造為第三目標(biāo)文件。本發(fā)明的跨平臺目標(biāo)文件復(fù)用方法,無需改動編譯器,僅對目標(biāo)文件進(jìn)行處理,使不同編譯器生成的目標(biāo)文件可以復(fù)用?!緦@f明】跨平臺目標(biāo)文件復(fù)用方法【
技術(shù)領(lǐng)域:
】[0001]本發(fā)明涉及計(jì)算機(jī)領(lǐng)域,尤其涉及一種跨平臺目標(biāo)文件復(fù)用方法。【
背景技術(shù):
】[0002]同一編程語言不同編譯器之間甚至不同語言之間的目標(biāo)文件進(jìn)行共享/復(fù)用,如C語言目標(biāo)文件有elf格式、COfT格式和omf格式。軟件保護(hù)中,使用自定編譯器(一般使用開源編譯器以節(jié)省時(shí)間和成本)對部分源文件進(jìn)行編譯和處理生成加密的代碼是一種有效的方法。軟件開發(fā)需要一整套的開發(fā)工具,包括文本編輯器、編譯器、匯編器、鏈接器等,對于軟件保護(hù)工具開發(fā)者而言,開發(fā)這樣一套工具是不經(jīng)濟(jì)也不必要的,用戶使用其慣用的開發(fā)工具而配以軟件保護(hù)工具是一種實(shí)用的方法。例如MicrosoftVisualStudio是一套常用的商用軟件開發(fā)工具,可以以開源的GCC(GNUCompilerCollection)或clang編譯器為基礎(chǔ)開發(fā)軟件保護(hù)工具配合VC編譯器使用,保護(hù)C/C++語言開發(fā)的軟件。但是,不同編譯器的目標(biāo)文件格式不同,不能兼容。更改結(jié)構(gòu)復(fù)雜,源代碼冗長的編譯器是一種代價(jià)較大的方法。[0003]COFF(CommonObjectFileFormat,通用對象文件格式)是一種很流行的對象文件格式。比如,VisualStudio編譯器所產(chǎn)生的目標(biāo)文件(*.0bj)就是這種格式。其它的編譯器,如GCC、ICL(IntelC/C++Compiler)、VectorC,也使用這種格式的目標(biāo)文件。不僅僅是C/C++,很多其它語言也使用這種格式的對象文件。[0004]COFF文件的整體結(jié)構(gòu)如下:[0005]FileHeaderOptionalHeaderSectionHeaderISectionHeadern[0006]SectionDataRelocationDirectivesLineNumbersSymbolTableStringTable0[0007]COFF文件一共有8種數(shù)據(jù),自上而下分別為:[0008]1.文件頭(FileHeader)[0009]2.可選頭(OptionalHeader)[0010]3.段落頭(SectionHeader)[0011]4.段落數(shù)據(jù)(SectionData)[0012]5.重定位表(RelocationDirectives)[0013]6.行號表(LineNumbers)[0014]7.符號表(SymbolTable)[0015]8.字符串表(StringTable)。[0016]其中,除了段落頭可以有多個(gè)節(jié)(因?yàn)榭梢杂卸鄠€(gè)段落)以外,其它的所有類型的節(jié)只能有一個(gè)。[0017]文件頭:C0FF文件的頭,它用來保存COFF文件的基本信息,如文件標(biāo)識,各個(gè)表的位置等等。[0018]可選頭:在目標(biāo)文件中,基本上都沒有這個(gè)頭;但在其它的文件中(如:可執(zhí)行文件)這個(gè)段用來保存在文件頭中沒有描述到的信息。[0019]段落頭:用來描述段落信息,每個(gè)段落都有一個(gè)段落頭來描述。段落的數(shù)目在文件頭中會指出。[0020]段落數(shù)據(jù):通常是COFF文件中最大的數(shù)據(jù)段,每個(gè)段落真正的數(shù)據(jù)就保存在這個(gè)位置。[0021]重定位表:通常只存在于目標(biāo)文件中,用來描述COFF文件中符號的重定位信息。[0022]符號表:用來保存COFF文件中所用到的所有符號的信息,連接多個(gè)COFF文件時(shí),這個(gè)表幫助我們重定位符號。調(diào)試程序時(shí)也要用到它。[0023]字符串表:用來保存字符串的。符號表是以記錄的形式來描述符號信息的,但它只為符號名稱留置了8個(gè)字符的空間,在現(xiàn)在的程序中,一個(gè)符號名動不動就數(shù)十個(gè)字符,8個(gè)字符空間的不夠,因此需將這些名稱存在字符串表中。而符號表中只記錄這些字符串的位置。[0024]ELF格式簡介如下:[0025]ELF(ExecutableandLinkableFormat,可執(zhí)行連接格式)是UNIX系統(tǒng)實(shí)驗(yàn)室(USL)作為應(yīng)用程序二進(jìn)制接口(ApplicationBinaryInterface,ABI)而開發(fā)和發(fā)布的。[0026]ELF頭位于文件的開始,描述了該文件的組織情況。sections保存著object文件的信息,較為常見的section包括指令、數(shù)據(jù)、符號表、字符串表、重定位信息等等。section頭表(sectionheadertable)包含了描述文件sections的信息。每個(gè)section在這個(gè)表中有一個(gè)入口;每個(gè)入口給出了該section的名字,大小,等等信息。各部分分布如下表所示:[0027]ElfheaderProgramheadertablesectionlsectionnsectionheadertable[0028]現(xiàn)有的編譯器其目標(biāo)文件格式大多數(shù)是公開的,如MicrosoftVisualC++的目標(biāo)文件格式為COFF格式;CLANG、GCC的目標(biāo)文件格式為ELF格式(也可輸出其它格式,如C0FF,但有很多不同,不能兼容);C++Builder、Delphi的目標(biāo)文件格式為OMF格式。雖然上述幾種目標(biāo)文件格式不同,但其要素相似,其基本構(gòu)成為:節(jié)區(qū)/段(section/segment)、符號(symbol)、重定位(relocation/fixup)。[0029]不同目標(biāo)文件格式有著不同的符號名命名方式。一般C語言函數(shù)、變量名未加修飾或加前綴(例如:用戶在源代碼中編輯的函數(shù)“Func”,ELF格式中該函數(shù)的符號名仍為“Func”,而COFF格式中該函數(shù)的符號名為“_Func”),而C++語言函數(shù)、變量符號名中都包含了類名、命名空間、類型等信息?!?br/>發(fā)明內(nèi)容】[0030]本發(fā)明提供一種跨平臺目標(biāo)文件復(fù)用方法,無需改動編譯器,僅對目標(biāo)文件進(jìn)行處理,使不同編譯器生成的目標(biāo)文件可以復(fù)用。[0031]為了解決上述技術(shù)問題,本發(fā)明提供了一種跨平臺目標(biāo)文件復(fù)用方法,包括以下步驟:[0032]S1:讀取第一目標(biāo)文件,并解析其文件結(jié)構(gòu);[0033]S2:根據(jù)解析結(jié)果,將第一目標(biāo)文件的以符號為單位,分解為各符號及其數(shù)據(jù)、重定位信息;[0034]S3:對第一目標(biāo)文件的符號名進(jìn)行更新處理;[0035]S4:按照第二目標(biāo)文件的文件格式將分解第一目標(biāo)文件得到的各符號及其數(shù)據(jù)、重定位信息構(gòu)造為第三目標(biāo)文件。[0036]作為優(yōu)選,所述第一目標(biāo)文件和第二目標(biāo)文件分別為通過第一編譯器和第二編譯器編譯生成的格式不同的目標(biāo)文件。[0037]作為優(yōu)選,第二編譯器及其鏈接器配置為能夠復(fù)用所述第三目標(biāo)文件。[0038]作為優(yōu)選,所述符號包括函數(shù)、變量、常量。[0039]作為優(yōu)選,所述步驟S3具體包括:[0040]S31:根據(jù)所述第一目標(biāo)文件所屬文件類型的符號名命名格式解析第一目標(biāo)文件的符號名信息,符號名信息包括名字、類型,其中:[0041]對于面向?qū)ο笳Z言可選地包括命名空間、類名;[0042]對于函數(shù)可選地包括調(diào)用約定、參數(shù)列表;[0043]對于模板可選地包括模板參數(shù)類型;[0044]S32:根據(jù)所述符號名信息和所述第二目標(biāo)文件的符號名命名規(guī)則構(gòu)造新的符號名。[0045]作為優(yōu)選,在對微軟的COFF文件符號名信息進(jìn)行解析的情況下,步驟S31具體包括:[0046]S311:讀取第一目標(biāo)文件符號名的第一個(gè)字段,如果該字段不為‘?’,判定第一目標(biāo)文件符號名為根據(jù)C語言命名的符號名;[0047]S312:根據(jù)第一目標(biāo)文件符號名的第二個(gè)字段解析函數(shù)或者變量名;[0048]S313:根據(jù)第一目標(biāo)文件符號名的第三個(gè)字段解析類名/命名空間;[0049]S314:解析第一目標(biāo)文件符號名的第四個(gè)字段表示的是函數(shù)還是變量,如果是函數(shù)則根據(jù)后續(xù)字段解析函數(shù)調(diào)用約定和作用域,然后解析返回值及各參數(shù)的類型;如果是變量則根據(jù)后續(xù)字段解析變量的作用域,然后解析變量類型,再解析變量所在內(nèi)存空間的訪問屬性。[0050]作為優(yōu)選,在構(gòu)造微軟的COFF文件符號名的情況下,步驟S32具體包括:[0051]S321:添加C++符號標(biāo)識‘?’;[0052]S322:添加函數(shù)或者變量名;[0053]S323:依次添加類名/命名空間的標(biāo)識;[0054]S324:如果是函數(shù)則添加調(diào)用約定標(biāo)識和作用域標(biāo)識,然后依次添加返回值和各參數(shù)的類型字符串及結(jié)束標(biāo)識,再添加默認(rèn)的異常規(guī)范標(biāo)識;如果是變量則添加變量作用域字符串,然后添加變量類型字符串,再添加變量所在內(nèi)存空間的訪問屬性標(biāo)識。[0055]作為優(yōu)選,所述步驟S4具體包括:[0056]S41:構(gòu)造所述第三目標(biāo)文件的段;[0057]S42:添加數(shù)據(jù),構(gòu)造所述第三目標(biāo)文件的符號表;[0058]S43:添加所述第三目標(biāo)文件的重定位;[0059]S44:繼續(xù)添加與所述第三目標(biāo)文件格式及運(yùn)行時(shí)的庫有關(guān)的必要要素信息。[0060]與現(xiàn)有技術(shù)相比,本發(fā)明的跨平臺目標(biāo)文件復(fù)用方法的有益效果在于:通過對異構(gòu)目標(biāo)文件格式進(jìn)行符號和結(jié)構(gòu)轉(zhuǎn)換,構(gòu)造匹配用戶所用開發(fā)工具的新的目標(biāo)文件,無需改動編譯器,使不同編譯器生成的目標(biāo)文件可以復(fù)用??梢蕴岣卟煌幾g器目標(biāo)文件格式不同的兼容性、簡化操作、節(jié)省成本?!緦@綀D】【附圖說明】[0061]圖1為本發(fā)明的實(shí)施例的跨平臺目標(biāo)文件復(fù)用方法的流程示意圖。【具體實(shí)施方式】[0062]下面結(jié)合附圖和具體實(shí)施例對本發(fā)明的實(shí)施例的跨平臺目標(biāo)文件復(fù)用方法作進(jìn)一步詳細(xì)描述,但不作為對本發(fā)明的限定。[0063]圖1為本發(fā)明的實(shí)施例的跨平臺目標(biāo)文件復(fù)用方法的流程示意圖。本發(fā)明的實(shí)施例的跨平臺目標(biāo)文件復(fù)用方法,包括以下步驟:[0064]S1:讀取第一目標(biāo)文件,并解析其文件結(jié)構(gòu)(段、符號、重定位);[0065]S2:根據(jù)解析結(jié)果,將第一目標(biāo)文件的以符號為單位,分解為各符號及其數(shù)據(jù)、重定位信息;[0066]S3:對第一目標(biāo)文件的符號名進(jìn)行更新處理;[0067]S4:按照第二目標(biāo)文件的文件格式將分解第一目標(biāo)文件得到的各符號及其數(shù)據(jù)、重定位信息構(gòu)造為第三目標(biāo)文件。[0068]其中,步驟S2中符號包括函數(shù)、變量、常量等信息。[0069]本發(fā)明的方法通過對異構(gòu)目標(biāo)文件格式進(jìn)行符號和結(jié)構(gòu)轉(zhuǎn)換,構(gòu)造匹配用戶所用開發(fā)工具的新的目標(biāo)文件,無需改動編譯器,使不同編譯器生成的目標(biāo)文件可以復(fù)用。可以提高不同編譯器目標(biāo)文件格式不同的兼容性、簡化操作、節(jié)省成本。[0070]作為本發(fā)明的一個(gè)改進(jìn),第一目標(biāo)文件和第二目標(biāo)文件為分別通過編譯器編譯生成的格式不同的目標(biāo)文件。作為本實(shí)施例的優(yōu)選方案,采用的具體方式為,第一目標(biāo)文件為通過第一編譯器編譯生成的目標(biāo)文件,而進(jìn)一步的,第二目標(biāo)文件為通過第二編譯器編譯生成的與第一目標(biāo)文件格式不同的目標(biāo)文件。第一編譯器和第二編譯器均為現(xiàn)有的編譯器,如GCC(GNU編譯器集合)、Clang編譯器等,其區(qū)別在于,兩個(gè)編譯器編譯生成的目標(biāo)文件格式不同。[0071]作為進(jìn)一步的改進(jìn),第二編譯器及其鏈接器配置為可以復(fù)用第三目標(biāo)文件,以使得第三目標(biāo)文件與第二目標(biāo)文件具有相同的文件格式。本實(shí)施例中,第三目標(biāo)文件與第二目標(biāo)文件具有相同的文件格式,即第二編譯器及其鏈接器可以復(fù)用第三目標(biāo)文件。[0072]作為更進(jìn)一步的改進(jìn),步驟S3具體包括:[0073]S31:根據(jù)第一目標(biāo)文件所屬文件類型的符號名命名格式解析第一目標(biāo)文件的符號名信息,符號名信息包括名字、類型。對面向?qū)ο笳Z言(如C++)還可能包括命名空間、類名,對函數(shù),可能包括調(diào)用約定、參數(shù)列表等,對于模板則可選地包括模板參數(shù)類型。[0074]具體的,例如對于C++函數(shù)“voidCalculate::add(int,int)”,在MicrosoftVisualC++編譯后的目標(biāo)文件中其符號名為“?add@Calculate_YAHHH@Z”,其中?表示該符號是C++符號而非C符號;add為函數(shù)名;第一個(gè)@為命名空間/類名的起始標(biāo)識;Calculated表示函數(shù)包含在Calculate類/命名空間中;第三個(gè)O為命名空間/類名的結(jié)束標(biāo)識;YA表示該符號為cdecl類型的全局函數(shù);HHH表示函數(shù)的依次表示返回值和各參數(shù)的類型,H表示int類型;第四個(gè)@為參數(shù)結(jié)束標(biāo)識;最后一個(gè)字母Z表示默認(rèn)的異常規(guī)范;總之,該函數(shù)除了函數(shù)體外的所有信息都包含在符號名中,從而可以解析和重構(gòu)。作為一種實(shí)施方式,在對微軟的COFF文件符號名信息進(jìn)行解析的情況下,以MicrosoftVisualC++所用的COFF格式為例,步驟S31具體包括:a.讀取符號名第一個(gè)字符,如果不為‘?’,表示其為C語言而來的符號;b.解析函數(shù)/變量名;c.解析類名/命名空間;d.解析該符號是函數(shù)還是變量,如果是函數(shù)則跳轉(zhuǎn)到e,否則跳轉(zhuǎn)到g;e.解析函數(shù)調(diào)用約定和作用域;f.解析返回值及各參數(shù)的類型;g.解析變量的作用域;h.解析變量類型;1.解析變量所在內(nèi)存空間的訪問屬性。[0075]S32:根據(jù)符號名信息和第二目標(biāo)文件的符號名命名規(guī)則構(gòu)造新的符號名。[0076]作為一種實(shí)施方式,在構(gòu)造微軟的COFF文件符號名的情況下,以MicrosoftVisualC++所用的COFF格式為例,構(gòu)造該格式符號名的過程包括:a.添加C++符號標(biāo)識‘?’;b.添加函數(shù)/變量名;c.依次添加類名/命名空間開始標(biāo)識類名/命名空間及分隔符(如果不在任何類或命名空間中則省略此項(xiàng))、類名/命名空間結(jié)束標(biāo)識如果是函數(shù)則跳轉(zhuǎn)到e,否則跳轉(zhuǎn)到h;e.添加調(diào)用約定標(biāo)識和作用域標(biāo)識;f.依次添加返回值和各參數(shù)的類型字符串及結(jié)束標(biāo)識添加默認(rèn)的異常規(guī)范標(biāo)識‘Z’;h.添加變量作用域字符串添加變量類型字符串添加變量所在內(nèi)存空間的訪問屬性標(biāo)識。[0077]作為更進(jìn)一步的改進(jìn),步驟S4具體包括:[0078]S41:構(gòu)造第三目標(biāo)文件的段;[0079]S42:添加數(shù)據(jù),構(gòu)造第三目標(biāo)文件的符號表;[0080]S43:添加第三目標(biāo)文件的重定位;[0081]S44:繼續(xù)添加要素信息,例如其他與目標(biāo)文件格式及運(yùn)行時(shí)庫有關(guān)的必要要素信肩、O[0082]為使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下參照附圖并舉實(shí)施例,對本發(fā)明進(jìn)一步詳細(xì)說明。[0083]實(shí)施例1[0084]本實(shí)施例中,目標(biāo)文件I為elf格式,目標(biāo)文件2為coff格式,編程語言為C語言。在具體實(shí)現(xiàn)上,本實(shí)施例采用了中間結(jié)構(gòu)對符號、重定位進(jìn)行描述和轉(zhuǎn)換。[0085]【權(quán)利要求】1.一種跨平臺目標(biāo)文件復(fù)用方法,其特征在于,包括以下步驟:S1:讀取第一目標(biāo)文件,并解析其文件結(jié)構(gòu);S2:根據(jù)解析結(jié)果,將所述第一目標(biāo)文件以符號為單位,分解為各符號及其數(shù)據(jù)、重定位信息;S3:對第一目標(biāo)文件的符號名進(jìn)行更新處理;S4:按照第二目標(biāo)文件的文件格式將分解第一目標(biāo)文件得到的各符號及其數(shù)據(jù)、重定位信息構(gòu)造為第三目標(biāo)文件。2.根據(jù)權(quán)利要求1所述的跨平臺目標(biāo)文件復(fù)用方法,其特征在于,所述第一目標(biāo)文件和第二目標(biāo)文件分別為通過第一編譯器和第二編譯器編譯生成的格式不同的目標(biāo)文件。3.根據(jù)權(quán)利要求2所述的跨平臺目標(biāo)文件復(fù)用方法,其特征在于,第二編譯器及其鏈接器配置為能夠復(fù)用所述第三目標(biāo)文件。4.根據(jù)權(quán)利要求1所述的跨平臺目標(biāo)文件復(fù)用方法,其特征在于,所述符號包括函數(shù)、變量、常量。5.根據(jù)權(quán)利要求4所述的跨平臺目標(biāo)文件復(fù)用方法,其特征在于,所述步驟S3具體包括:531:根據(jù)所述第一目標(biāo)文件所屬文件類型的符號名命名格式解析第一目標(biāo)文件的符號名信息,符號名信息包括名字、類型,其中:對于面向?qū)ο笳Z言可選地包括命名空間、類名;對于函數(shù)可選地包括調(diào)用約定、參數(shù)列表;對于模板可選地包括模板參數(shù)類型;532:根據(jù)所述符號名信息和所述第二目標(biāo)文件的符號名命名規(guī)則構(gòu)造新的符號名。6.根據(jù)權(quán)利要求5所述的跨平臺目標(biāo)文件復(fù)用方法,其特征在于,在對微軟的COFF文件符號名信息進(jìn)行解析的情況下,步驟S31具體包括:5311:讀取第一目標(biāo)文件符號名的第一個(gè)字段,如果該字段不為‘?’,判定第一目標(biāo)文件符號名為根據(jù)C語言命名的符號名;5312:根據(jù)第一目標(biāo)文件符號名的第二個(gè)字段解析函數(shù)或者變量名;5313:根據(jù)第一目標(biāo)文件符號名的第三個(gè)字段解析類名/命名空間;S314:解析第一目標(biāo)文件符號名的第四個(gè)字段表示的是函數(shù)還是變量,如果是函數(shù)則根據(jù)后續(xù)字段解析函數(shù)調(diào)用約定和作用域,然后解析返回值及各參數(shù)的類型;如果是變量則根據(jù)后續(xù)字段解析變量的作用域,然后解析變量類型,再解析變量所在內(nèi)存空間的訪問屬性。7.根據(jù)權(quán)利要求6所述的跨平臺目標(biāo)文件復(fù)用方法,其特征在于,在構(gòu)造微軟的COFF文件符號名的情況下,步驟S32具體包括:5321:添加C++符號標(biāo)識‘?’;5322:添加函數(shù)或者變量名;5323:依次添加類名/命名空間的標(biāo)識;5324:如果是函數(shù)則添加調(diào)用約定標(biāo)識和作用域標(biāo)識,然后依次添加返回值和各參數(shù)的類型字符串及結(jié)束標(biāo)識,再添加默認(rèn)的異常規(guī)范標(biāo)識;如果是變量則添加變量作用域字符串,然后添加變量類型字符串,再添加變量所在內(nèi)存空間的訪問屬性標(biāo)識。8.根據(jù)權(quán)利要求5所述的跨平臺目標(biāo)文件復(fù)用方法,其特征在于,所述步驟S4具體包括:541:構(gòu)造所述第三目標(biāo)文件的段;542:添加數(shù)據(jù),構(gòu)造所述第三目標(biāo)文件的符號表;543:添加所述第三目標(biāo)文件的重定位;S44:繼續(xù)添加與所述第三目標(biāo)文件格式及運(yùn)行時(shí)的庫有關(guān)的必要要素信息?!疚臋n編號】G06F9/44GK103886095SQ201410133527【公開日】2014年6月25日申請日期:2014年4月3日優(yōu)先權(quán)日:2014年4月3日【發(fā)明者】孫吉平,韓勇申請人:北京深思數(shù)盾科技有限公司