專利名稱::在嵌入式系統(tǒng)剪裁可重定位的elf文件的方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及嵌入式系統(tǒng)上文件格式的問題,特別是涉及一種在嵌入式系統(tǒng)剪裁可重定位的ELF文件的方法。技術(shù)背景ELF(ExecutableandLinkingFormat)文件格式是UNIX系統(tǒng)實(shí)驗(yàn)室作為應(yīng)用程序二進(jìn)制接口(ApplicationBinaryInterface)而開發(fā)和發(fā)布的,它包含了三種格式,一個(gè)可重定位(relocatable)文件保存著代碼和適當(dāng)?shù)臄?shù)據(jù),用來和其他的目標(biāo)文件一起來創(chuàng)建一個(gè)可執(zhí)行文件或者是一個(gè)共享文件,也可以作為模塊來發(fā)布,例Linux的內(nèi)核模塊;一個(gè)可執(zhí)行(executable)文件保存著一個(gè)用來執(zhí)行的程序,該文件指出了如何來創(chuàng)建程序進(jìn)程映像;一個(gè)共享ELF文件保存著代碼和合適的數(shù)據(jù),用來被鏈接器鏈接。隨著Linux和基于Linux的交叉編譯環(huán)境越來越廣泛的應(yīng)用到各種嵌入式系統(tǒng)中,ELF文件格式也越來越多的出現(xiàn)在各種嵌入式平臺(tái)上。尤其可重定位的ELF文件可以在運(yùn)行時(shí)動(dòng)態(tài)的鏈接,加載,在嵌入式系統(tǒng)中可以得到很好的應(yīng)用。標(biāo)準(zhǔn)的ELF文件格式是基于32位和64位兩種環(huán)境的,而很多嵌入式則是基于8位或者16位的環(huán)境,交叉編譯出的標(biāo)準(zhǔn)ELF文件中的數(shù)據(jù)類型是基于32位的,因此ELF文件內(nèi)部有很大一部分空間是閑置的。而且ELF文件中的符號(hào)表,包含了程序本身涉及到的所有的符號(hào)信息,也存在一些冗余的信息。
發(fā)明內(nèi)容本發(fā)明的目的在于提供一種在嵌入式系統(tǒng)上裁剪可重定位的ELF文件的方法,使裁剪后的文件結(jié)構(gòu)更加緊湊,冗余信息更少。本發(fā)明采用的技術(shù)方案的步驟如下1)根據(jù)原ELF文件所依賴的體系結(jié)構(gòu)重新定義ELF文件中需要的數(shù)據(jù)類型;2)由步驟l)定義的數(shù)據(jù)類型重新定義ELF文件中的結(jié)構(gòu)體;3)解析原ELF文件,讀取原ELF文件信息,根據(jù)此信息填充步驟2)中的結(jié)構(gòu)體;4)由步驟3)所得的重新定義ELF文件信息獲取文件的重定位段,根據(jù)其中的重定位信息,提取重定位相關(guān)聯(lián)的符號(hào),組織這些符號(hào)成為新的符號(hào)表;5)根據(jù)步驟4)所組成的新的符號(hào)表提取其在原ELF文件字符串表中的名稱,組建新的字符串表;6)根據(jù)步驟3)中獲得的結(jié)構(gòu)體,步驟4)中的新的符號(hào)表和步驟5)中的新的符號(hào)表和原ELF文件的信息,來組織成一個(gè)新的文件,用新的數(shù)據(jù)結(jié)構(gòu)定義代替原來的數(shù)據(jù)結(jié)構(gòu),用新的符號(hào)表和字符串表代替原來的符號(hào)表和字符串表,將其余沒有改變的節(jié)內(nèi)容拷貝到新的文件中。所述的重新定義ELF文件中需要的數(shù)據(jù)類型,是ELF文件的基本數(shù)據(jù)類型,是基于32位環(huán)境的,包括Elf32—Addr,Elf32—Half,Elf32—Off,Elf32—Sword,Elf32—Word禾口unsignedchar。所述的重新定義ELF文件中的結(jié)構(gòu)體,包括Elf32一ehdr,Elf32—shdr,Elf32—rel,Elf32—rela和Elf32—sym結(jié)構(gòu)體。所述的原和重新定義的ELF文件中的重定位是連接符號(hào)引用和符號(hào)定義的過程,符號(hào)表保存了原和重新定義的ELF文件中涉及到的符號(hào)的信息,只有和重定位關(guān)聯(lián)的符號(hào)才會(huì)在重定位過程中引用到,根據(jù)其中的重定位信息,提取重定位相關(guān)聯(lián)的符號(hào),用這些需要用到的符號(hào)來組織稱新的符號(hào)表。所述的原和重新定義的ELF文件中的字符串表保存著以NULL終止的一系列字符,原和重新定義的ELF用這些字符串來描繪符號(hào)名,因此要重新提取新的符號(hào)表中符號(hào)名組織新的字符串。所述的組織成一個(gè)新的文件的時(shí)候,采用的是新的結(jié)構(gòu)體,新的符號(hào)表,新的字符串表和原ELF文件中信息,不會(huì)改變原ELF文件的.text,.data,.bss段的信息,不會(huì)影響原ELF文件的運(yùn)行。與
背景技術(shù):
相比,本發(fā)明具有的有益的效果是本發(fā)明其方法是平臺(tái)無關(guān)的,可以應(yīng)用在各種嵌入式平臺(tái)上面。其優(yōu)勢在于在資源受限的嵌入式系統(tǒng)上裁剪標(biāo)準(zhǔn)的ELF文件格式,通過改變ELF文件的數(shù)據(jù)類型和刪減一些冗余的符號(hào)信息,使可重定位的ELF文件更加緊湊,更加小型化,對于一些資源受限的嵌入式系統(tǒng)來說,可以使系統(tǒng)的資源利用率更高效。附圖說明附圖是本發(fā)明的裁剪方法的說明圖。具體實(shí)施例方式如附圖所示,在以下的實(shí)施實(shí)例中,將提供一種剪裁基于AVR平臺(tái)下的可重定位的ELF文件的方法,但可以了解的是,本發(fā)明方法并不局限于特定的平臺(tái)。1)原ELF文件其中數(shù)據(jù)類型都是基于32位環(huán)境的,定義如下:NameSizeAlignmentPurposeElf32_Addr44UnsignedprogramaddressEl。2—Half22UnsignedmediumintegerElf32—Off44UnsignedfileoffsetElf32_Sword44SignedlargeintegerElfi2_Word44Unsignedlargeintegerunsignedchar11Unsignedsmallinteger:avr平臺(tái)上數(shù)據(jù)類型則是16位的,將數(shù)據(jù)類型重新定義為NamsSizeAlignmentPurposeElfl6一Addr22UnsignedprogramaddressElfl6_Half11UnsignedmediumintegerElfl6一Off22UnsignedfileoffsetElfl6—Sword22SignedlargeintegerElf16—Word22Unsignedlargeintegerunsignedchar11Unsignedsmallinteger2)重新定義ELF文件的各種數(shù)據(jù)結(jié)構(gòu),Elf32—Ehdr,Elf32—Shdr,Elf32—Sym,Elf32—Rel,Elf32一Rela,用基于16位環(huán)境的數(shù)據(jù)類型代替原來32位的數(shù)據(jù)類型,例如結(jié)構(gòu)體Elf32Ehdr:typedefstruct{unsignedcharEl。2_HalfEl。2—HalfElf32—WordElf32_AddrElf32_OffElf32—OffElf32一WordElf32一HalfElf32Halfe—ident[EI—NIDENT];e—type;e—machine;e一version;e—entryje_phoff;e_shoff;e_flags;e一ehsize;e_phentsize;Elf32一HalfElf32一HalfEl。2一HalfElf32—Half}Elf32一Ehdr;將重新定義為typedefstruct{unsignedcharElfl6一HalfElfl6一HalfElf16—WordElfl6一AddrElfl6—OffElfl6_OffElfl6一WordElfl6—HalfElfl6一HalfElfl6一HalfElfl6一HalfElfl6一HalfElfl6一Half}E1H6—Ehdr;其余結(jié)構(gòu)體依此類推。3)用重新定義的各種數(shù)據(jù)結(jié)構(gòu)來描述原ELF文件中的各種信息,將原ELF文件的32位的結(jié)構(gòu)體中的值逐一賦值到基于16位的結(jié)構(gòu)體中;4)提取和重定位相關(guān)的符號(hào),可重定位的原和重新定義的ELF文件的符號(hào)表保存了一個(gè)程序在重定位時(shí)需要的定義和引用的信息,并非符號(hào)表中所有的符號(hào)都會(huì)被引用到,通過把和重定位關(guān)聯(lián)的符號(hào)提取出來形成新的符號(hào)表。重定位段是由若干Elf32一Rela結(jié)構(gòu)體組成的,每個(gè)結(jié)構(gòu)體對應(yīng)著一個(gè)重定位入口,結(jié)構(gòu)體中的r—info成員給出了具有受重定位影響因素的符號(hào)表索引,根據(jù)這個(gè)索引提取出符號(hào)表中的符號(hào),根據(jù)提取出的符號(hào)組建新的符號(hào)表。5)根據(jù)新的符號(hào)表重組新的字符串表,字符串表保存著以NULL終止的一e_phnum;e—shentsize;e—shnum)eshstrndx;e—ident[EI—NIDENT];e—type;e一machiri6;e一version;e_entry;e_phoff;e一shoff;e一flags;e—ehsize;e_phentsizge_phnum;e—shentsize;e—shnumjeshstrndx;系列字符,一般稱為字符串。原和重新定義的ELF文件使用這些字符串來描繪符號(hào)。一個(gè)符號(hào)表入口有如下的格式-typedefstruct{Elfl6—Wordst_name;Elfl6一Addrst—value;Elfl6一Wordst—size;unsignedcharst一info;unsignedcharst一other;Elfl6_Halfst—shndx;}Elfl6一Sym;其中sLname保存了該符號(hào)在字符串表入口的索引(保留了符號(hào)名的表達(dá)字符)。字符串表保存了符號(hào)表里所有符號(hào)的名字,因?yàn)榉?hào)表被刪減了部分,因此需要?jiǎng)h除字符串表中對應(yīng)的字符串,并同時(shí)更新符號(hào)表入口中st_name成員變量的值,使它指向新的字符串表中正確的位置。6)根據(jù)基于16位環(huán)境的結(jié)構(gòu)體和裁剪后的字符串表和符號(hào)表配合和原ELF文件的信息,來將標(biāo)準(zhǔn)的可重定位的ELF文件格式轉(zhuǎn)換為更緊湊的二進(jìn)制文件格式。7)經(jīng)過裁減后的ELF文件,并沒有改變原來的ELF文件中的每個(gè)節(jié)的信息,比如文本段.text和數(shù)據(jù)段.data的內(nèi)容并沒有被改變,文件中的數(shù)據(jù)結(jié)構(gòu)的內(nèi)容也不會(huì)改變,刪減掉的符號(hào)表中的信息是用不到的符號(hào)的信息,因此不會(huì)影響加載后的ELF文件的正常運(yùn)行。權(quán)利要求1.一種在嵌入式系統(tǒng)剪裁可重定位的ELF文件的方法,其特征在于該方法的步驟如下1)根據(jù)原ELF文件所依賴的體系結(jié)構(gòu)重新定義ELF文件中需要的數(shù)據(jù)類型;2)由步驟1)定義的數(shù)據(jù)類型重新定義ELF文件中的結(jié)構(gòu)體;3)解析原ELF文件,讀取原ELF文件信息,根據(jù)此信息填充步驟2)中的結(jié)構(gòu)體;4)由步驟3)所得的重新定義ELF文件信息獲取文件的重定位段,根據(jù)其中的重定位信息,提取重定位相關(guān)聯(lián)的符號(hào),組織這些符號(hào)成為新的符號(hào)表;5)根據(jù)步驟4)所組成的新的符號(hào)表提取其在原ELF文件字符串表中的名稱,組建新的字符串表;6)根據(jù)步驟3)中獲得的結(jié)構(gòu)體,步驟4)中的新的符號(hào)表和步驟5)中的新的符號(hào)表和原ELF文件的信息,來組織成一個(gè)新的文件,用新的數(shù)據(jù)結(jié)構(gòu)定義代替原來的數(shù)據(jù)結(jié)構(gòu),用新的符號(hào)表和字符串表代替原來的符號(hào)表和字符串表,將其余沒有改變的節(jié)內(nèi)容拷貝到新的文件中。2.根據(jù)權(quán)利要求1所述的一種在嵌入式系統(tǒng)剪裁可重定位的ELF文件的方法,其特征在于所述的重新定義ELF文件中需要的數(shù)據(jù)類型,是ELF文件的基本數(shù)據(jù)類型,是基于32位環(huán)境的,包括Elf32_Addr,Elf32—Half,Elf32一Off,Elf32—Sword,Elf32—Word和unsignedchar。3.根據(jù)權(quán)利要求1所述的一種在嵌入式系統(tǒng)剪裁可重定位的ELF文件的方法,其特征在于所述的重新定義ELF文件中的結(jié)構(gòu)體,包括Elf32一ehdr,Elf32—shdr,Elf32—rel,Elf32—rela和Elf32—sym結(jié)構(gòu)體。4.根據(jù)權(quán)利要求1所述的一種在嵌入式系統(tǒng)剪裁可重定位的ELF文件的方法,其特征在于所述的原和重新定義的ELF文件中的重定位是連接符號(hào)引用和符號(hào)定義的過程,符號(hào)表保存了原和重新定義的ELF文件中涉及到的符號(hào)的信息,只有和重定位關(guān)聯(lián)的符號(hào)才會(huì)在重定位過程中引用到,根據(jù)其中的重定位信息,提取重定位相關(guān)聯(lián)的符號(hào),用這些需要用到的符號(hào)來組織稱新的符號(hào)表。5.根據(jù)權(quán)利要求1所述的一種在嵌入式系統(tǒng)剪裁可重定位的ELF文件的方法,其特征在于所述的原和重新定義的ELF文件中的字符串表保存著以NULL終止的一系列字符,原和重新定義的ELF用這些字符串來描繪符號(hào)名,因此要重新提取新的符號(hào)表中符號(hào)名組織新的字符串。6.根據(jù)權(quán)利要求1所述的一種在嵌入式系統(tǒng)剪裁可重定位的ELF文件的方法,其特征在于所述的組織成一個(gè)新的文件的時(shí)候,采用的是新的結(jié)構(gòu)體,新的符號(hào)表,新的字符串表和原ELF文件中信息,不會(huì)改變原ELF文件的.text,.data,.bss段的信息,不會(huì)影響原ELF文件的運(yùn)行。全文摘要本發(fā)明公開了一種在嵌入式系統(tǒng)剪裁可重定位的ELF文件的方法。根據(jù)原ELF文件所依賴的體系結(jié)構(gòu),重新定義ELF文件中需要的數(shù)據(jù)類型和結(jié)構(gòu)體;根據(jù)重定位信息,提取重定位相關(guān)聯(lián)的符號(hào),組織新的符號(hào)表和字符串表;用新的數(shù)據(jù)結(jié)構(gòu)定義代替原來的數(shù)據(jù)結(jié)構(gòu),用新的符號(hào)表和字符串表代替原來的符號(hào)表和字符串表,將其余沒有改變的節(jié)內(nèi)容拷貝到新的文件中。本發(fā)明與平臺(tái)無關(guān),可以應(yīng)用在各種嵌入式平臺(tái)上面。其優(yōu)勢在于在資源受限的嵌入式系統(tǒng)上裁剪標(biāo)準(zhǔn)的ELF文件格式,通過改變ELF文件的數(shù)據(jù)類型和刪減一些冗余的符號(hào)信息,使可重定位的ELF文件更加緊湊,更加小型化,對于一些資源受限的嵌入式系統(tǒng)來說,可以使系統(tǒng)的資源利用率更高效。文檔編號(hào)G06F9/45GK101271399SQ200810061580公開日2008年9月24日申請日期2008年5月7日優(yōu)先權(quán)日2008年5月7日發(fā)明者卜佳俊,騰國棟,瑋董,純陳申請人:浙江大學(xué)