在嵌入式系统剪裁可重定位的ELF文件的方法转让专利

申请号 : CN200810061580.X

文献号 : CN100585561C

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 陈纯卜佳俊董玮腾国栋

申请人 : 浙江大学浙江浙大网新集团有限公司

摘要 :

本发明公开了一种在嵌入式系统剪裁可重定位的ELF文件的方法。根据原ELF文件所依赖的体系结构,重新定义ELF文件中需要的数据类型和结构体;根据重定位信息,提取重定位相关联的符号,组织新的符号表和字符串表;用新的数据结构定义代替原来的数据结构,用新的符号表和字符串表代替原来的符号表和字符串表,将其余没有改变的节内容拷贝到新的文件中。本发明与平台无关,可以应用在各种嵌入式平台上面。其优势在于在资源受限的嵌入式系统上裁剪标准的ELF文件格式,通过改变ELF文件的数据类型和删减一些冗余的符号信息,使可重定位的ELF文件更加紧凑,更加小型化,对于一些资源受限的嵌入式系统来说,可以使系统的资源利用率更高效。

权利要求 :

1.一种在嵌入式系统剪裁可重定位的ELF文件的方法,其特征在于该方法 的步骤如下:

1)根据原ELF文件所依赖的体系结构重新定义ELF文件中需要的数据类 型;

2)由步骤1)定义的数据类型重新定义ELF文件中的结构体;

3)解析原ELF文件,读取原ELF文件信息,根据此信息填充步骤2)中的 结构体,产生重新定义ELF文件信息;

4)由步骤3)所得的重新定义ELF文件信息获取文件的重定位段,根据其 中的重定位信息,提取重定位相关联的符号,组织这些符号成为新的符号表;

5)根据步骤4)所组成的新的符号表提取其在原ELF文件字符串表中的名 称,组建新的字符串表;

6)根据步骤3)中获得的结构体,步骤4)的新的符号表和步骤5)的新的 字符串表和原ELF文件的信息,来组织成一个新的文件,用新的数据结构定义 代替原来的数据结构,用新的符号表和字符串表代替原来的符号表和字符串表, 将其余没有改变的节内容拷贝到新的文件中。

2.根据权利要求1所述的一种在嵌入式系统剪裁可重定位的ELF文件的方 法,其特征在于:所述的重新定义ELF文件中需要的数据类型,是ELF文件的 基本数据类型,是基于32位环境的,包括Elf32_Addr,Elf32_Half,Elf32_Off, Elf32_Sword,Elf32_Word和unsigned char。

3.根据权利要求1所述的一种在嵌入式系统剪裁可重定位的ELF文件的方 法,其特征在于:所述的重新定义ELF文件中的结构体,包括Elf32_Ehdr, Elf32_Shdr,Elf32_Rel,Elf32_Rela和Elf32_Sym结构体。

4.根据权利要求1所述的一种在嵌入式系统剪裁可重定位的ELF文件的方 法,其特征在于:所述的原ELF文件和重新定义ELF文件中的重定位是连接符 号引用和符号定义的过程,符号表保存了原ELF文件和重新定义ELF文件中涉 及到的符号的信息,只有和重定位关联的符号才会在重定位过程中引用到,根 据其中的重定位信息,提取重定位相关联的符号,用这些需要用到的符号来组 织称新的符号表。

5.根据权利要求1所述的一种在嵌入式系统剪裁可重定位的ELF文件的方 法,其特征在于:所述的原ELF文件和重新定义ELF文件中的字符串表保存着 以NULL终止的一系列字符,原ELF文件和重新定义ELF文件用这些字符串来 描绘符号名,因此要重新提取新的符号表中符号名组织新的字符串。

6.根据权利要求1所述的一种在嵌入式系统剪裁可重定位的ELF文件的方 法,其特征在于:所述的组织成一个新的文件的时候,采用的是新的结构体、 新的符号表、新的字符串表和原ELF文件中信息,不会改变原ELF文件 的.text,.data,.bss段的信息,不会影响原ELF文件的运行。

说明书 :

技术领域

本发明涉及嵌入式系统上文件格式的问题,特别是涉及一种在嵌入式系统剪 裁可重定位的ELF文件的方法。

背景技术

ELF(Executable and Linking Format)文件格式是UNIX系统实验室作为应用 程序二进制接口(Application Binary Interface)而开发和发布的,它包含了三种格 式,一个可重定位(relocatable)文件保存着代码和适当的数据,用来和其他的目 标文件一起来创建一个可执行文件或者是一个共享文件,也可以作为模块来发 布,例Linux的内核模块;一个可执行(executable)文件保存着一个用来执行的程 序,该文件指出了如何来创建程序进程映像;一个共享ELF文件保存着代码和 合适的数据,用来被链接器链接。
随着Linux和基于Linux的交叉编译环境越来越广泛的应用到各种嵌入式系 统中,ELF文件格式也越来越多的出现在各种嵌入式平台上。尤其可重定位的 ELF文件可以在运行时动态的链接,加载,在嵌入式系统中可以得到很好的应 用。标准的ELF文件格式是基于32位和64位两种环境的,而很多嵌入式则是 基于8位或者16位的环境,交叉编译出的标准ELF文件中的数据类型是基于 32位的,因此ELF文件内部有很大一部分空间是闲置的。而且ELF文件中的符 号表,包含了程序本身涉及到的所有的符号信息,也存在一些冗余的信息。

发明内容

本发明的目的在于提供一种在嵌入式系统上裁剪可重定位的ELF文件的方 法,使裁剪后的文件结构更加紧凑,冗余信息更少。
本发明采用的技术方案的步骤如下:
1)根据原ELF文件所依赖的体系结构重新定义ELF文件中需要的数据类 型;
2)由步骤1)定义的数据类型重新定义ELF文件中的结构体;
3)解析原ELF文件,读取原ELF文件信息,根据此信息填充步骤2)中的 结构体,产生重新定义ELF文件信息;
4)由步骤3)所得的重新定义ELF文件信息获取文件的重定位段,根据其 中的重定位信息,提取重定位相关联的符号,组织这些符号成为新的符号表;
5)根据步骤4)所组成的新的符号表提取其在原ELF文件字符串表中的名 称,组建新的字符串表;
6)根据步骤3)中获得的结构体,步骤4)的新的符号表和步骤5)的新的 字符串表和原ELF文件的信息,来组织成一个新的文件,用新的数据结构定义 代替原来的数据结构,用新的符号表和字符串表代替原来的符号表和字符串表, 将其余没有改变的节内容拷贝到新的文件中。
所述的重新定义ELF文件中需要的数据类型,是ELF文件的基本数据类型, 是基于32位环境的,包括Elf32_Addr,Elf32_Half,Elf32_Off,Elf32_Sword, Elf32_Word和unsigned char。
所述的重新定义ELF文件中的结构体,包括Elf32_Ehdr,Elf32_Shdr, Elf32_Rel,Elf32_Rela和Elf32_Sym结构体。
所述的原ELF文件和重新定义的ELF文件中的重定位是连接符号引用和符 号定义的过程,符号表保存了原ELF文件和重新定义的ELF文件中涉及到的符 号的信息,只有和重定位关联的符号才会在重定位过程中引用到,根据其中的 重定位信息,提取重定位相关联的符号,用这些需要用到的符号来组织称新的 符号表。
所述的原ELF文件和重新定义的ELF文件中的字符串表保存着以NULL终 止的一系列字符,原ELF文件和重新定义的ELF用这些字符串来描绘符号名, 因此要重新提取新的符号表中符号名组织新的字符串。
所述的组织成一个新的文件的时候,采用的是新的结构体,新的符号表, 新的字符串表和原ELF文件中信息,不会改变原ELF文件的.text,.data,.bss段的 信息,不会影响原ELF文件的运行。
与背景技术相比,本发明具有的有益的效果是:
本发明其方法是平台无关的,可以应用在各种嵌入式平台上面。其优势在于 在资源受限的嵌入式系统上裁剪标准的ELF文件格式,通过改变ELF文件的数 据类型和删减一些冗余的符号信息,使可重定位的ELF文件更加紧凑,更加小 型化,对于一些资源受限的嵌入式系统来说,可以使系统的资源利用率更高效。

附图说明

附图是本发明的裁剪方法的说明图。

具体实施方式

如附图所示,在以下的实施实例中,将提供一种剪裁基于AVR平台下的可 重定位的ELF文件的方法,但可以了解的是,本发明方法并不局限于特定的平 台。
1)原ELF文件其中数据类型都是基于32位环境的,定义如下:
Name           Size   Alignment              Purpose
====       ====  =========  =======
Elf32_Addr     4         4                   Unsigned program address
Elf32_Half     2         2                   Unsigned medium integer
Elf32_Off      4         4                   Unsigned file offset
Elf32_Sword    4         4                   Signed large integer
Elf32_Word     4         4                   Unsigned large integer
unsigned char  1         1                   Unsigned small integer
而在avr平台上数据类型则是16位的,将数据类型重新定义为:
Name             Size   Alignment               Purpose
====         ====  =========   =======
Elf16_Addr       2         2                    Unsigned program address
Elf16_Half       1         1                    Unsigned medium integer
Elf16_Off        2         2                    Unsigned file offset
Elf16_Sword      2         2                    Signed large integer
Elf16_Word       2         2                    Unsigned large integer
unsigned char    1         1                    Unsigned small integer
2)重新定义ELF文件的各种数据结构,Elf32_Ehdr,Elf32_Shdr,Elf32_Sym, Elf32_Rel,Elf32_Rela,用基于16位环境的数据类型代替原来32位的数据类型, 例如结构体Elf32_Ehdr:
typedef struct{
    unsigned char    e_ident[EI_NIDENT];
    Elf32_Half        e_type;
    Elf32_Half        e_machine;
    Elf32_Word         e_version;
    Elf32_Addr         e_entry;
    Elf32_Off          e_phoff;
    Elf32_Off          e_shoff;
    Elf32_Word          e_flags;
    Elf32_Half         e_ehsize;
    Elf32_Half         e_phentsize;
    Elf32_Half    e_phnum;
    Elf32_Half    e_shentsize;
    Elf32_Half    e_shnum;
    Elf32_Half    e_shstrndx;
}Elf32_Ehdr;
将重新定义为:
typedef struct{
    unsigned char    e_ident[EI_NIDENT];
    Elf16_Half        e_type;
    Elf16_Half        e_machine;
    Elf16_Word         e_version;
    Elf16_Addr         e_entry;
    Elf16_Off         e_phoff;
    Elf16_Off         e_shoff;
    Elf16_Word         e_flags;
    Elf16_Half        e_ehsize;
    Elf16_Half        e_phentsize;
    Elf16_Half        e_phnum;
    Elf16_Half        e_shentsize;
    Elf16_Half        e_shnum;
    Elf16_Half        e_shstrndx;
}Elf16_Ehdr;
其余结构体依此类推。
3)用重新定义的各种数据结构来描述原ELF文件中的各种信息,将原ELF 文件的32位的结构体中的值逐一赋值到基于16位的结构体中;
4)提取和重定位相关的符号,可重定位的原和重新定义的ELF文件的符号 表保存了一个程序在重定位时需要的定义和引用的信息,并非符号表中所有的 符号都会被引用到,通过把和重定位关联的符号提取出来形成新的符号表。重 定位段是由若干Elf32_Rela结构体组成的,每个结构体对应着一个重定位入口, 结构体中的r_info成员给出了具有受重定位影响因素的符号表索引,根据这个 索引提取出符号表中的符号,根据提取出的符号组建新的符号表。
5)根据新的符号表重组新的字符串表,字符串表保存着以NULL终止的一 系列字符,一般称为字符串。原和重新定义的ELF文件使用这些字符串来描绘 符号。
一个符号表入口有如下的格式:
typedef struct{
    Elf16_Word st_name;
    Elf16_Addr st_value;
    Elf16_Word st_size;
    unsigned char  st_info;
    unsigned char  st_other;
    Elf16_Half st_shndx;
}Elf16_Sym;
其中st_name保存了该符号在字符串表入口的索引(保留了符号名的表达 字符)。字符串表保存了符号表里所有符号的名字,因为符号表被删减了部分, 因此需要删除字符串表中对应的字符串,并同时更新符号表入口中st_name成员 变量的值,使它指向新的字符串表中正确的位置。
6)根据基于16位环境的结构体和裁剪后的字符串表和符号表配合和原ELF 文件的信息,来将标准的可重定位的ELF文件格式转换为更紧凑的二进制文件 格式。
7)经过裁减后的ELF文件,并没有改变原来的ELF文件中的每个节的信息, 比如文本段.text和数据段.data的内容并没有被改变,文件中的数据结构的内容 也不会改变,删减掉的符号表中的信息是用不到的符号的信息,因此不会影响 加载后的ELF文件的正常运行。