CN106598674A - 一种基于可重定位elf文件的软件快速加载方法 - Google Patents
一种基于可重定位elf文件的软件快速加载方法 Download PDFInfo
- Publication number
- CN106598674A CN106598674A CN201611167417.2A CN201611167417A CN106598674A CN 106598674 A CN106598674 A CN 106598674A CN 201611167417 A CN201611167417 A CN 201611167417A CN 106598674 A CN106598674 A CN 106598674A
- Authority
- CN
- China
- Prior art keywords
- address
- sections
- index
- text
- software
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44521—Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种基于可重定位ELF文件的软件快速加载方法,包括:S1.确定要加载的软件,获取所述软件的软件包并进行解析,得到所述软件的代码文件,并将所述代码文件装载至运行空间;S2.判断是否存在所述软件的链接索引表,不存在则跳转到步骤S3,存在则跳转至步骤S4;S3.对所述代码文件进行重定位,生成可执行文件和包含所述重定位信息的链接索引表,完成软件加载,并将保存所述链接索引表;S4.获取所述链接索引表,并根据所述链接索引表对所述代码文件进行快速重定位,生成可执行文件,完成软件加载。本发明具有可加快软件的加载速度,降低软件加载过程中功耗等优点。
Description
技术领域
本发明涉及软件动态加载技术领域,尤其涉及一种基于可重定位ELF文件的软件快速加载方法。
背景技术
目前极为流行的智能手表、手环等智能设备多以ARM内核处理器为核心,适配市面上广泛使用的RTOS等微内核,再辅以软件重定位技术来实现软件的动态加载,以提供更加广泛的服务。
此类嵌入式设备的软件主要由ELF文件与资源文件俩部分组成。该ELF文件(代码文件)并非设备可以直接执行的机器代码,而是一种可重定位对象文件(Relocatablefile)。这种ELF文件需要经过***链接器链接加载后,才能形成可以被设备直接执行的机器码。
此类设备运行软件的方式有以下俩种:
1、软件加载域位于ROM,运行域位于RAM。软件在每次运行同一个动态软件的过程中,都需要将软件中的ELF部分拷贝到RAM中,进行link、load处理,然后才能生成可执行文件。所以,每次运行软件都需要耗费大量的时间,造成CPU资源的浪费。同时,此过程也消耗大量的电能,为原本容量就极小的电池带来更大的负担。但在这种方式中,由于软件运行域位于RAM中,需要在运行时再拷贝与链接,所以软件可以任意改变其存储位置。
2、软件加载域位于ROM,运行域也位于ROM中。这种方式下,软件在第一次运行时,需将ROM中的数据先拷贝到RAM中进行链接操作,然后写回原ROM地址,这个过程也被称为软件安装。这种方式优点是,软件只需要对软件代码段(.text)与只读数据段(.rodata)进行一次链接操作,以后每次运行时只需要加载软件的RAM部分即可,加载时间短,响应速度快,更为节能。这种方式缺点是,软件一次运行后,不能随意更改其存储位置。
目前这俩种方式都有一定的应用,但是由于目前智能手表、手环等低端智能设备配置低,所以上述俩种方式都会带来不利的影响。
发明内容
本发明要解决的技术问题就在于:针对现有技术存在的技术问题,本发明提供一种仅仅在软件第一次加载时需要完整的执行解析、链接等重定位步骤,并构建链接索引表,在第二次加载该软件时,即可根据现有的链接索引表,直接通过链接索引表执行链接过程,完成软件的重定位工作,生成可执行文件,可加快软件的加载速度,降低软件加载过程中功耗的基于可重定位ELF文件的软件快速加载方法。
为解决上述技术问题,本发明提出的技术方案为:一种基于可重定位ELF文件的软件快速加载方法,包括如下步骤:
S1.确定要加载的软件,获取所述软件的软件包并进行解析,得到所述软件的代码文件,并将所述代码文件装载至运行空间;所述代码文件包括.text段、.rodata段、.data段和.bss段;
S2.判断是否存在所述软件的链接索引表,不存在则跳转到步骤S3,存在则跳转至步骤S4;
S3.对所述代码文件进行重定位,生成可执行文件和包含所述重定位信息的链接索引表,完成软件加载,并将保存所述链接索引表;
S4.获取所述链接索引表,并根据所述链接索引表对所述代码文件进行快速重定位,生成可执行文件,完成软件加载。
作为本发明的进一步改进,所述代码文件装载至运行空间的加载方式包括:将所述代码文件装载至RAM空间;或者,将所述代码文件的.data段和.bss段装载至RAM空间,将所述代码文件的其余各段装载至ROM空间。
作为本发明的进一步改进,所述链接索引表包括索引表基本信息和重定位条目信息,所述索引表基本信息包括:代码文件唯一标识、.text段地址索引、.rodata段地址索引、.data段地址索引、.bss段地址索引;所述重定位条目信息包括:重定位条目的地址偏移量索引、重定位条目类型索引、重定位条目的实际地址索引;
所述.text段地址索引、.rodata段地址索引、.data段地址索引、.bss段地址索引分别为生成所述链接索引表时.text段、.rodata段、.data段、.bss段装载至运行空间中的首地址;所述重定位条目的地址偏移量索引为重定位条目在.text段中的地址偏移量,所述重定位条目类型索引为重定位条目类型,所述重定位条目的实际地址索引为生成所述链接索引表时重定位条目在运行空间中的实际地址。
作为本发明的进一步改进,所述重定位条目信息还包括所述.text段地址索引。
作为本发明的进一步改进,所述步骤S3的具体步骤包括:
S3.1.获取所述代码文件装载至运行空间后.text段的首地址,.rodata段的首地址,.data段的首地址,.bss段的首地址;
S3.2.对所述代码文件进行重定位,生成可执行文件,对于每个需要重定位的条目,获取重定位条目在.text段中的地址偏移量,重定位条目类型,重定位条目的实际地址;
S3.3.根据所述步骤S3.1和S3.2中所获取的.text段的首地址,.rodata段的首地址,.data段的首地址,.bss段的首地址,重定位条目在.text段中的地址偏移量,重定位条目类型,重定位条目的实际地址生成链接索引表,并保存所述链接索引表。
作为本发明的进一步改进,所述步骤S4的具体步骤包括:
S4.1.获取所述代码文件装载至运行空间的.text段的首地址、.rodata段的首地址、.data段的首地址、.bss段的首地址;
S4.2.根据所述.text段的首地址、.rodata段的首地址、.data段的首地址、.bss段的首地址和所述链接索引表中的索引表基本信息计算本次加载地址偏移量;
S4.3.遍历所述链接索引表的重定位条目信息,根据所述重定位条目的地址偏移量索引、重定位条目类型索引、重定位条目的实际地址索引和所述本次加载地址偏移量计算重定位条目在本次加载的实际地址,完成重定位。
作为本发明的进一步改进,所述本次加载地址偏移量包括.text段加载地址偏移量、.rodata段加载地址偏移量、.data段加载地址偏移量、.bss段加载地址偏移量;
所述.text段加载地址偏移量为所述.text段的首地址与所述.text段地址索引之间的地址偏移;
所述.rodata段加载地址偏移量为所述.rodata段的首地址所述.rodata段地址索引之间的地址偏移;
所述.data段加载地址偏移量为所述.data段的首地址.data段地址索引之间的地址偏移;
所述.bss段加载地址偏移量为所述.bss段的首地址.bss段地址索引之间的地址偏移。
作为本发明的进一步改进,所述步骤S4.3中计算重定位条目在本次加载的实际地址的具体步骤包括:
当所述重定位条目类型索引为.rodata,则根据所述.text段加载地址偏移量和所述重定位条目的实际地址索引计算所述重定位条目在本次加载的实际地址;
当所述重定位条目类型索引为Function call,且该条目位于OS中,则直接以所述重定位条目的实际地址索引作为所述重定位条目在本次加载的实际地址;
当所述重定位条目类型索引为Function call,且该条目位于所述代码文件中,则根据所述.text段加载地址偏移量和所述重定位条目的实际地址索引计算所述重定位条目在本次加载的实际地址;
当所述重定位条目类型索引为.data,则根据所述.data段加载地址偏移量和所述重定位条目的实际地址索引计算所述重定位条目在本次加载的实际地址;
当所述重定位条目类型索引为.bss,则根据所述.bss段加载地址偏移量和所述重定位条目的实际地址索引计算所述重定位条目在本次加载的实际地址。
作为本发明的进一步改进,所述软件包存储在运行该软件的设备之外的服务端设备上,所述链接索引表存储在运行该软件的设备之外的服务端设备上。
与现有技术相比,本发明的优点在于:
1、本发明仅仅在软件第一次加载时需要完整的执行解析、链接等重定位步骤,并构建链接索引表,在第二次加载该软件时,即可根据现有的链接索引表,直接通过链接索引表执行链接过程,完成软件的重定位工作,生成可执行文件,可加快软件的加载速度,降低软件加载过程中功耗。
2、本发明的软件包及链接索引表存储于服务端,只在软件需要运行时从服务端下载获取,减轻了本地的存储压力,同时也保证了安全性。
附图说明
图1为本发明具体实施例流程示意图。
图2为软件代码文件结构示意图。
图3为本发明具体实施例链接索引表结构示意图。
具体实施方式
以下结合说明书附图和具体优选的实施例对本发明作进一步描述,但并不因此而限制本发明的保护范围。
如图1所示,本实施例的基于可重定位ELF文件的软件快速加载方法,包括如下步骤:S1.确定要加载的软件,获取软件的软件包并进行解析,得到软件的代码文件,并将代码文件装载至运行空间;代码文件包括.text段、.rodata段、.data段和.bss段;S2.判断是否存在软件的链接索引表,不存在则跳转到步骤S3,存在则跳转至步骤S4;S3.对代码文件进行重定位,生成可执行文件和包含重定位信息的链接索引表,完成软件加载,并将保存链接索引表;S4.获取链接索引表,并根据链接索引表对代码文件进行快速重定位,生成可执行文件,完成软件加载。即在本实施例的软件加载过程中,当不存在链接索引表时,则按照常规方法对软件进行加载,包括解析代码文件、链接等过程,以现有方法对软件进行重定位,同时,还将对软件进行重定位所需要的全部重定位信息记录在链接索引表中。当存在链接索引表时,则按照链接索引表中的所记录的重定位信息直接进行重定位,从而加载重定位的过程,实现软件的快速加载。
代码文件(ELF文件)的结构如图2所示,包括:1、代码文件头(ELF Header),里面记载了代码文件的头信息;2、.text段,里面装置了可执行代码;3、.rodata段,里面装载了只读数据;4、.data段,里面装载了已被初始化的数据;5、.bss段,里面装载了未被初始化的数据;6、符号表.symtab,里面装载了符号信息;7、重定位表(.rel打头的段),里面装载了重定位条目信息。当然,ELF文件中还包括有为满足不同目的所设置的section,比如满足调试的目的、满足动态链接与加载的目的等等。在进行重定位时,一般需要查找ELF文件中的.text、.rodata、.data、.bss四部分,用以确定代码文件是完整的,然后再进行链接(即重定位)。
在本实施例中,在本实施例中,代码文件装载至运行空间的加载方式包括:将代码文件装载至RAM空间;或者,将代码文件的.data段和.bss段装载至RAM空间,将代码文件的其余各段装载至ROM空间。一般情况代码文件全部加载至RAM空间,进行解析重定位,但对于智能终端设备,由于其RAM空间大小有限,而ROM的读取速度与RAM的读取速度接近,因此,对于智能终端设备,可以只将.data段和.bss段装载至RAM空间,而将代码文件的其它段装载至ROM空间。无论采用哪种加载方式,.data段和.bss段均需要加载至RAM空间。
在本实施例中,当软件第一次加载,不存在链接索引表时,需要按照常规的方法对软件进行加载,以现有技术进行重定位(链接),并记录重定位信息。具体过程为:S3.1.获取代码文件装载至运行空间后.text段的首地址,.rodata段的首地址,.data段的首地址,.bss段的首地址;S3.2.对代码文件进行重定位,生成可执行文件,对于每个需要重定位的条目,获取重定位条目在.text段中的地址偏移量,重定位条目类型,重定位条目的实际地址;S3.3.根据步骤S3.1和S3.2中所获取的.text段的首地址,.rodata段的首地址,.data段的首地址,.bss段的首地址,重定位条目在.text段中的地址偏移量,重定位条目类型,重定位条目的实际地址生成链接索引表,并保存链接索引表。
现有的链接过程通常可分为两个步骤,A、链接器首先查到重定位表.rel.text,再查找符号表.symtab、字符串表.strtab和.shstrab。通过.rel.text的大小可以得出需要重定位的单元数:nr_reloc=size(.rel.text)/size(rel_Item);其中,nr_reloc为需要重定位的单元数,size(.rel.text)为.rel.text的大小,size(Item)为每一个重定位单元的大小(ELF文件规定的一个已知的大小)。B、由于每一个重定位单元的大小是固定的,所以通过步骤A中所查找到的.rel.text的地址,可以知道每一个重定位单元的内容。每一个重定位单元都包括以下几部分:a、包含一个符号表(.symtab)中一个条目的索引,用于确定哪一个符号需要被重定位;b、包含一个.text中的地址单元的偏移值,这个偏移值处的地址单元里面存放着BL指令的操作数;c、包含一个tag,以指明该重定位属于何种类型。
在采用链接器去链接代码文件的时候,链接器会遍历所有的重定位单元,碰到外部引用(***API函数、全局变量等),通过找到该外部引用的确切地址(如果外部引用为函数,则该地址需要***提供API时给出,重定位时需要遍历API表,获得相对应的外部引用地址),并且把它写回到上述BL指令操作数所占用的那个地址单元。
因此,重定位操作与五个因素有关:代码文件的首地址,以及.text段与.rodata段部分的首地址;代码文件中.data段与.bss段的首地址,以及其加载到RAM中运行的首地址;重定位单元的在.text中的地址偏移量;重定位条目的类型;外部引用的地址。
在重定位过程中,重定位所需要修改的对象全部位于.text段,也就是说一个ELF文件在重定位过程中,内容需要发生改变的只有.text段。下面以重定位条目为全局变量N1的重定位过程进行具体说明。在编译后生成的代码文件的.data段中将存在该全局变量N1。此时,记N1在.data段中相对.data段的段首地址偏移为N1_data_offset。在代码文件的符号表.symtab中分别存在与该全局变量N1相对应的s_N1条目,s_N1条目的st_value属性保存着N1_data_offset。在代码文件的.text段中也存在与该全局变量N1相对应的t_N1条目,t_N1条目用于存放全局变量N1的外部引用地址(即实际地址),此时,记该t_N1条目在.text段中相对于.text段首的地址偏移Item_offset为N1_text_offset。在代码文件的重定位表.rel.text中也存在分别与该全局变量N1相对应的r_N1条目,该条目具有r_offset和r_info两个属性,r_N1条目的r_offset属性保存着N1_text_offset,r_info属性保存着s_N1条目在.symtab中的条目索引及条目类型。通过r_offset属性可确定重定位条目在.text段中的位置,通过r_info属性可确定重定位条目的类型及在.symtab中的对应条目。
代码文件装载至运行空间后,可以确定.text段在运行空间中的首地址,记为text_addr;可以确定.data段在运行空间中的首地址,记为data_load_addr。在重定位时,首先查找重定位表.rel.text,找到r_N1条目,根据r_offset属性确定N1_text_offset,根据r_info找到.symtab中的s_N1条目,并确定N1条目的类型为.data类型。由N1_text_offset+text_addr即可计算得到t_N1条目的实际地址。根据.symtab中的s_N1条目的st_value属性可确定.data段中该全局变量N1相对于.data段的段首地址偏移N1_data_offset,由N1_data_offset+data_load_addr即可计算得到全局变量N1的外部引用地址(即实际地址),将该全局变量N1的外部引用地址写入到.text段中t_N1条目中,即完成了对全局变量的重定位。
其中,外部引用的地址计算因重定位条目类型的不同而不同,总的分为五种:
a、若重定位条目类型为.rodata,该重定位条目在.symtab中所对应条目的st_value属性值为st_value,则外部引用地址为sym_val=rodata_addr+st_value,其中rodata_addr为代码文件装载至运行空间后.rodata段的段首地址;
b、若重定位条目类型为Function call,且该条目位于OS(***)中,其所对应的API地址为API_addr,则外部引用地址为sym_val=API_addr;
c、若重定位条目类型为Function call,且其位于该ELF文件中,该条目在.symtab中所对应条目的st_value属性值为st_value,则该条目外部引用地址为sym_val=text_addr+st_value,其中text_addr为代码文件装载至运行空间后.text段的段首地址;
d、若重定位条目类型为.data,且该条目在.symtab中所对应条目的st_value属性值为st_value,则外部引用地址为sym_val=data_load_addr+st_value,其中data_load_addr为代码文件装载至运行空间后.data段的段首地址;
e、若重定位条目类型为.bss,且该条目在.symtab中所对应条目的st_value属性值为st_value,则外部引用地址为sym_val=bss_load_addr+st_value,其中bss_load_addr为代码文件装载至运行空间后.bss段的段首地址。
以上具体的操作可以用一个函数概括:os_module_symbol_relocate(elf_text_addr,Item_offset,Item_tag,sym_val);其中,elf_text_addr、Item_offset、Iem_tag、sym_val分别表示代码文件装载至运行空间后.text段的段首地址、重定位单元的在.text段中的地址偏移量、重定位条目的类型、外部引用的地址,以上即为现有软件加载过程中完整的重定位过程。
在本实施例中,在根据现有重定位过程进行重定位时,需要将其中的重定位信息进行保存,生成链接索引表,以提供给软件在下次重定位时使用,提高软件的加载速度。如图3所示,链接索引表包括索引表基本信息和重定位条目信息,索引表基本信息包括:代码文件唯一标识、.text段地址索引、.rodata段地址索引、.data段地址索引、.bss段地址索引;重定位条目信息包括:重定位条目的地址偏移量索引、重定位条目类型索引、重定位条目的实际地址索引;.text段地址索引、.rodata段地址索引、.data段地址索引、.bss段地址索引分别为生成链接索引表时.text段、.rodata段、.data段、.bss段装载至运行空间中的首地址;重定位条目的地址偏移量索引为重定位条目在.text段中的地址偏移量,重定位条目类型索引为重定位条目类型,重定位条目的实际地址索引为生成链接索引表时重定位条目在运行空间中的实际地址。在本实施例中,.text段地址索引的值为上述text_addr,.rodata段地址索引为上述rodata_addr,.data段地址索引为上述data_load_addr,.bss段地址索引为上述bss_load_addr,重定位条目的地址偏移量索引为上述Item_offset,重定位条目类型索引为上述r_info、重定位条目的实际地址索引为上述计算得到的外部引用地址sym_val。
由于对每个重定位条目进行重定位时,均需要查询并读取.text段地址索引,为了加快读取速度,在重定位条目信息中还包括.text段地址索引。通过对.text段地址索引的冗余存储,以空间换时间的方式,进一步加快对软件的加载速度。
同时,针对于仅将.data段和.bss段均需要加载至RAM空间的软件加载方式,在加载时需要将位于ROM上的.data段和.bss段从ROM空间拷贝至RAM空间。链接索引表的基本信息还可以包括.data段的ROM地址索引,.data段的大小,.bss段的ROM地址索引和.bss段的大小等信息。
在本实施例中,当软件并非初次加载,即在软件加载时已存在有链接索引表,则可直接通过链接索引表进行重定位,而不需要再次按照常规方法进行重定位。其重定位的步骤S4的具体步骤为:S4.1.获取代码文件装载至运行空间的.text段的首地址、.rodata段的首地址、.data段的首地址、.bss段的首地址;S4.2.根据.text段的首地址、.rodata段的首地址、.data段的首地址、.bss段的首地址和链接索引表中的索引表基本信息计算本次加载地址偏移量;S4.3.遍历链接索引表的重定位条目信息,根据重定位条目的地址偏移量索引、重定位条目类型索引、重定位条目的实际地址索引和本次加载地址偏移量计算重定位条目在本次加载的实际地址,完成重定位。
在本实施例中,本次加载地址偏移量包括.text段加载地址偏移量、.rodata段加载地址偏移量、.data段加载地址偏移量、.bss段加载地址偏移量;.text段加载地址偏移量为.text段的首地址与.text段地址索引之间的地址偏移;.rodata段加载地址偏移量为.rodata段的首地址.rodata段地址索引之间的地址偏移;.data段加载地址偏移量为.data段的首地址.data段地址索引之间的地址偏移;.bss段加载地址偏移量为.bss段的首地址.bss段地址索引之间的地址偏移。
在本实施例中,步骤S4.3中计算重定位条目在本次加载的实际地址的具体步骤为:当重定位条目类型索引为.rodata,则根据.text段加载地址偏移量和重定位条目的实际地址索引计算重定位条目在本次加载的实际地址;当重定位条目类型索引为Functioncall,且该条目位于OS中,则直接以重定位条目的实际地址索引作为重定位条目在本次加载的实际地址;当重定位条目类型索引为Function call,且该条目位于代码文件中,则根据.text段加载地址偏移量和重定位条目的实际地址索引计算重定位条目在本次加载的实际地址;当重定位条目类型索引为.data,则根据.data段加载地址偏移量和重定位条目的实际地址索引计算重定位条目在本次加载的实际地址;当重定位条目类型索引为.bss,则根据.bss段加载地址偏移量和重定位条目的实际地址索引计算重定位条目在本次加载的实际地址。
在本实施例中,仍以全局变量N1为例进行说明,通过上述的软件初始加载过程,生成了链接索引表,在软件的再次加载时,可直接获得该链接索引表中所记载的信息。当软件的代码文件装载至运行空间后,可获得本次装载的.text段的首地址、.rodata段的首地址、.data段的首地址、.bss段的首地址,分别记为text_addr_1、rodata_addr_1、data_load_addr_1、bss_load_addr_1。根据链接索引表中的.text段地址索引、.rodata段地址索引、.data段地址索引、.bss段地址索引,可分别计算本次加载与生成链接索引表加载时各段的地址偏移,.text段加载地址偏移量为TEXT_OFFSET=text_addr_1-text_addr,.rodata段加载地址偏移量为RODATA_OFFSET=rodata_addr_1-rodata_addr,.data段加载地址偏移量为DATA_OFFSET=data_load_addr_1-data_load_addr,.bss段加载地址偏移量为BSS_OFFSET=bss_load_addr_1-bss_load_addr。同时,通过链接索引表,可以得到全局变量N1的重定位条目的地址偏移量索引Item_offset、重定位条目类型索引r_info、重定位条目的实际地址索引sym_val。通过重定位条目类型索引r_info可确定N1的类型的.data类型,则在本次加载中,全局变量N1的外部引用地址为:sym_val_1=DATA_OFFSET+sym_val,.text段中与该全局变量N1相对应的t_N1条目的实际地址为:TEXT_OFFSET+Item_offset,将sym_val_1的外部引用地址值写入t_N1条目中即完成了对全局变量N1的重定位。相比于传统的重定位过程,不需要对代码文件进行解析等操作,大大的节省了重定位的时间。
在本实施例中,对于不同类型的重定位条目,在本次加载中计算外部引用地址的方法为:
a、若重定位条目类型为.rodata,则sym_val_1=RODATA_OFFSET+sym_val;
b、若重定位条目类型为Function call,且该条目位于OS(***)中,则sym_val_1=sym_val;
c、若重定位条目类型为Function call,且其位于该ELF文件中,则sym_val_1=TEXT_OFFSET+sym_val;
d、若重定位条目类型为.data,则sym_val_1=DATA_OFFSET+sym_val;
e、若重定位条目类型为.bss,则sym_val_1=BSS_OFFSET+sym_val。
在本实施例中,软件包存储在运行该软件的设备之外的服务端设备上,链接索引表存储在运行该软件的设备之外的服务端设备上。通过将软件包和链接索引表存储在服务端上,可以节省本地设备的存储空间,特别是对于智能手表、智能手环等智能可穿戴设备,本地存储空间极为有限,将软件包和链接索引表存储在服务端,在需要加载时才从服务端下载,可有效减轻本地设备的存储压力,同时也提高了数据的安全性。
上述只是本发明的较佳实施例,并非对本发明作任何形式上的限制。虽然本发明已以较佳实施例揭露如上,然而并非用以限定本发明。因此,凡是未脱离本发明技术方案的内容,依据本发明技术实质对以上实施例所做的任何简单修改、等同变化及修饰,均应落在本发明技术方案保护的范围内。
Claims (9)
1.一种基于可重定位ELF文件的软件快速加载方法,其特征在于,包括如下步骤:
S1.确定要加载的软件,获取所述软件的软件包并进行解析,得到所述软件的代码文件,并将所述代码文件装载至运行空间;所述代码文件包括.text段、.rodata段、.data段和.bss段;
S2.判断是否存在所述软件的链接索引表,不存在则跳转到步骤S3,存在则跳转至步骤S4;
S3.对所述代码文件进行重定位,生成可执行文件和包含所述重定位信息的链接索引表,完成软件加载,并将保存所述链接索引表;
S4.获取所述链接索引表,并根据所述链接索引表对所述代码文件进行快速重定位,生成可执行文件,完成软件加载。
2.根据权利要求1所述的基于可重定位ELF文件的软件快速加载方法,其特征在于:所述代码文件装载至运行空间的加载方式包括:将所述代码文件装载至RAM空间;或者,将所述代码文件的.data段和.bss段装载至RAM空间,将所述代码文件的其余各段装载至ROM空间。
3.根据权利要求2所述的基于可重定位ELF文件的软件快速加载方法,其特征在于:所述链接索引表包括索引表基本信息和重定位条目信息,所述索引表基本信息包括:代码文件唯一标识、.text段地址索引、.rodata段地址索引、.data段地址索引、.bss段地址索引;所述重定位条目信息包括:重定位条目的地址偏移量索引、重定位条目类型索引、重定位条目的实际地址索引;
所述.text段地址索引、.rodata段地址索引、.data段地址索引、.bss段地址索引分别为生成所述链接索引表时.text段、.rodata段、.data段、.bss段装载至运行空间中的首地址;所述重定位条目的地址偏移量索引为重定位条目在.text段中的地址偏移量,所述重定位条目类型索引为重定位条目类型,所述重定位条目的实际地址索引为生成所述链接索引表时重定位条目在运行空间中的实际地址。
4.根据权利要求3所述的基于可重定位ELF文件的软件快速加载方法,其特征在于:所述重定位条目信息还包括所述.text段地址索引。
5.根据权利要求1至4任一项所述的基于可重定位ELF文件的软件快速加载方法,其特征在于,所述步骤S3的具体步骤包括:
S3.1.获取所述代码文件装载至运行空间后.text段的首地址,.rodata段的首地址,.data段的首地址,.bss段的首地址;
S3.2.对所述代码文件进行重定位,生成可执行文件,对于每个需要重定位的条目,获取重定位条目在.text段中的地址偏移量,重定位条目类型,重定位条目的实际地址;
S3.3.根据所述步骤S3.1和S3.2中所获取的.text段的首地址,.rodata段的首地址,.data段的首地址,.bss段的首地址,重定位条目在.text段中的地址偏移量,重定位条目类型,重定位条目的实际地址生成链接索引表,并保存所述链接索引表。
6.根据权利要求1至4任一项所述的基于可重定位ELF文件的软件快速加载方法,其特征在于,所述步骤S4的具体步骤包括:
S4.1.获取所述代码文件装载至运行空间的.text段的首地址、.rodata段的首地址、.data段的首地址、.bss段的首地址;
S4.2.根据所述.text段的首地址、.rodata段的首地址、.data段的首地址、.bss段的首地址和所述链接索引表中的索引表基本信息计算本次加载地址偏移量;
S4.3.遍历所述链接索引表的重定位条目信息,根据所述重定位条目的地址偏移量索引、重定位条目类型索引、重定位条目的实际地址索引和所述本次加载地址偏移量计算重定位条目在本次加载的实际地址,完成重定位。
7.根据权利要求6所述的基于可重定位ELF文件的软件快速加载方法,其特征在于:所述本次加载地址偏移量包括.text段加载地址偏移量、.rodata段加载地址偏移量、.data段加载地址偏移量、.bss段加载地址偏移量;
所述.text段加载地址偏移量为所述.text段的首地址与所述.text段地址索引之间的地址偏移;
所述.rodata段加载地址偏移量为所述.rodata段的首地址所述.rodata段地址索引之间的地址偏移;
所述.data段加载地址偏移量为所述.data段的首地址.data段地址索引之间的地址偏移;
所述.bss段加载地址偏移量为所述.bss段的首地址.bss段地址索引之间的地址偏移。
8.根据权利要求7所述的基于可重定位ELF文件的软件快速加载方法,其特征在于,所述步骤S4.3中计算重定位条目在本次加载的实际地址的具体步骤包括:
当所述重定位条目类型索引为.rodata,则根据所述.text段加载地址偏移量和所述重定位条目的实际地址索引计算所述重定位条目在本次加载的实际地址;
当所述重定位条目类型索引为Function call,且该条目位于OS中,则直接以所述重定位条目的实际地址索引作为所述重定位条目在本次加载的实际地址;
当所述重定位条目类型索引为Function call,且该条目位于所述代码文件中,则根据所述.text段加载地址偏移量和所述重定位条目的实际地址索引计算所述重定位条目在本次加载的实际地址;
当所述重定位条目类型索引为.data,则根据所述.data段加载地址偏移量和所述重定位条目的实际地址索引计算所述重定位条目在本次加载的实际地址;
当所述重定位条目类型索引为.bss,则根据所述.bss段加载地址偏移量和所述重定位条目的实际地址索引计算所述重定位条目在本次加载的实际地址。
9.根据权利要求8所述的基于可重定位ELF文件的软件快速加载方法,其特征在于:所述软件包存储在运行该软件的设备之外的服务端设备上,所述链接索引表存储在运行该软件的设备之外的服务端设备上。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611167417.2A CN106598674A (zh) | 2016-12-16 | 2016-12-16 | 一种基于可重定位elf文件的软件快速加载方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611167417.2A CN106598674A (zh) | 2016-12-16 | 2016-12-16 | 一种基于可重定位elf文件的软件快速加载方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN106598674A true CN106598674A (zh) | 2017-04-26 |
Family
ID=58599692
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201611167417.2A Pending CN106598674A (zh) | 2016-12-16 | 2016-12-16 | 一种基于可重定位elf文件的软件快速加载方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106598674A (zh) |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108255475A (zh) * | 2017-12-19 | 2018-07-06 | 芯海科技(深圳)股份有限公司 | 一种elf文件格式的扩展应用方法 |
CN110569040A (zh) * | 2019-09-17 | 2019-12-13 | 深圳市优创亿科技有限公司 | 一种在嵌入式***内安装、运行应用程序的方法 |
CN110633210A (zh) * | 2019-08-23 | 2019-12-31 | 北京三快在线科技有限公司 | 文件执行方法、装置、存储介质和电子设备 |
CN110765027A (zh) * | 2019-12-27 | 2020-02-07 | 中国人民解放军国防科技大学 | 一种pe文件地址定位*** |
CN111984411A (zh) * | 2020-08-18 | 2020-11-24 | 上海睿赛德电子科技有限公司 | 一种用于资源受限平台的应用重定位方法 |
CN113590138A (zh) * | 2020-04-30 | 2021-11-02 | 华为技术有限公司 | 可执行文件处理方法和设备 |
CN114895986A (zh) * | 2022-06-10 | 2022-08-12 | 展讯通信(深圳)有限公司 | 全局变量的重定位方法和装置 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20070067765A1 (en) * | 2005-08-05 | 2007-03-22 | Giovanni Motta | Efficient generator of update packages for mobile devices that uses non-ELF preprocessing |
CN101277265A (zh) * | 2008-05-07 | 2008-10-01 | 浙江大学 | 一种无线传感网络中加速加载elf文件的方法 |
CN101697131A (zh) * | 2009-11-04 | 2010-04-21 | 中兴通讯股份有限公司 | 一种可重定位文件动态加载的方法及装置 |
CN105224370A (zh) * | 2015-10-21 | 2016-01-06 | 安一恒通(北京)科技有限公司 | 一种加载elf文件的方法和装置 |
CN105426223A (zh) * | 2015-12-25 | 2016-03-23 | 百度在线网络技术(北京)有限公司 | 应用加载方法和装置 |
-
2016
- 2016-12-16 CN CN201611167417.2A patent/CN106598674A/zh active Pending
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20070067765A1 (en) * | 2005-08-05 | 2007-03-22 | Giovanni Motta | Efficient generator of update packages for mobile devices that uses non-ELF preprocessing |
CN101277265A (zh) * | 2008-05-07 | 2008-10-01 | 浙江大学 | 一种无线传感网络中加速加载elf文件的方法 |
CN101697131A (zh) * | 2009-11-04 | 2010-04-21 | 中兴通讯股份有限公司 | 一种可重定位文件动态加载的方法及装置 |
CN105224370A (zh) * | 2015-10-21 | 2016-01-06 | 安一恒通(北京)科技有限公司 | 一种加载elf文件的方法和装置 |
CN105426223A (zh) * | 2015-12-25 | 2016-03-23 | 百度在线网络技术(北京)有限公司 | 应用加载方法和装置 |
Non-Patent Citations (1)
Title |
---|
中国计算机学会,香港电脑学会: "《信息就是力量"97香港-北京国际计算机会议论文集》", 31 October 1997, 清华大学出版社 * |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108255475A (zh) * | 2017-12-19 | 2018-07-06 | 芯海科技(深圳)股份有限公司 | 一种elf文件格式的扩展应用方法 |
CN110633210A (zh) * | 2019-08-23 | 2019-12-31 | 北京三快在线科技有限公司 | 文件执行方法、装置、存储介质和电子设备 |
CN110569040A (zh) * | 2019-09-17 | 2019-12-13 | 深圳市优创亿科技有限公司 | 一种在嵌入式***内安装、运行应用程序的方法 |
CN110765027A (zh) * | 2019-12-27 | 2020-02-07 | 中国人民解放军国防科技大学 | 一种pe文件地址定位*** |
CN113590138A (zh) * | 2020-04-30 | 2021-11-02 | 华为技术有限公司 | 可执行文件处理方法和设备 |
WO2021218756A1 (zh) * | 2020-04-30 | 2021-11-04 | 华为技术有限公司 | 可执行文件处理方法和设备 |
CN111984411A (zh) * | 2020-08-18 | 2020-11-24 | 上海睿赛德电子科技有限公司 | 一种用于资源受限平台的应用重定位方法 |
CN114895986A (zh) * | 2022-06-10 | 2022-08-12 | 展讯通信(深圳)有限公司 | 全局变量的重定位方法和装置 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106598674A (zh) | 一种基于可重定位elf文件的软件快速加载方法 | |
US9201659B2 (en) | Efficient directed acyclic graph pattern matching to enable code partitioning and execution on heterogeneous processor cores | |
CN104246762B (zh) | Html5 i‑frame扩展 | |
US20110154299A1 (en) | Apparatus and method for executing instrumentation code | |
US9792132B2 (en) | Code generator and method for generating extra code for a virtual machine | |
CN104335168A (zh) | 分支预测预加载 | |
CN103678685A (zh) | 一种网页标注方法及装置 | |
US20110138236A1 (en) | Apparatus and method for providing visual interface for information of error generated in multithread testing | |
CN109710396B (zh) | 一种信息采集及内存释放的方法及装置 | |
CN103226510B (zh) | 解析vmcore文件的方法和装置 | |
CN102662799B (zh) | 数据备份的方法、服务器及热备份*** | |
CN102135943B (zh) | 闪存数据的存储、访问方法及装置 | |
CN106202100A (zh) | 页面的加载方法及装置 | |
CN104050215A (zh) | 清除和重建相关性的***和方法 | |
CN103019556A (zh) | 快捷帮助信息显示***和快捷帮助信息显示方法 | |
CN103677778A (zh) | 一种CAP文件Classref常量的解析方法 | |
CN108021405A (zh) | 一种soc***启动过程中存储介质的驱动方法和装置 | |
CN103154891A (zh) | 虚拟机阶段检测 | |
CN107544811A (zh) | IOS平台隐藏dylib文件的方法、存储介质、电子设备及*** | |
US9880925B1 (en) | Collecting structured program code output | |
US9158545B2 (en) | Looking ahead bytecode stream to generate and update prediction information in branch target buffer for branching from the end of preceding bytecode handler to the beginning of current bytecode handler | |
CN104516823B (zh) | 一种数据存储方法和装置 | |
CN105867886A (zh) | 一种写表格的方法及装置 | |
KR20140093593A (ko) | 워크 그룹 크기 결정 방법, 시스템 및 컴퓨터 판독가능 기록매체 | |
JP2008305246A (ja) | 情報処理装置、キャッシュフラッシュ制御方法及び情報処理制御装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
TA01 | Transfer of patent application right |
Effective date of registration: 20170707 Address after: 410083 Hunan province Changsha Lushan Road No. 932 Applicant after: Central South University Applicant after: HUNAN NEW CLOUDNET TECHNOLOGY CO., LTD. Address before: 410083 Hunan province Changsha Lushan Road No. 932 Applicant before: Central South University Applicant before: Hunan, Information Technology Co. Ltd. |
|
TA01 | Transfer of patent application right | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20170426 |
|
RJ01 | Rejection of invention patent application after publication |