一种可重定位文件动态加载的方法及装置的制作方法

文档序号:6583069阅读:240来源:国知局

专利名称::一种可重定位文件动态加载的方法及装置的制作方法
技术领域
:本发明涉及一种嵌入式微内核操作系统,特别是涉及一种可重定位文件动态加载的方法及装置。
背景技术
:随着科技的发展,移动电话呈现出个人计算机(PC)化的发展驱势,其所需的动态应用文件越来越多。移动电话一般分为智能移动电话(smartphone)和非智能移动电话(featherphone),智能移动电话如wince、uli皿x等操作系统基本都实现了动态加载技术,类似于PC上可动态加载应用的Windows操作系统的动态链接库、或Linux操作系统的动态共享文件;而featherphone多数基于嵌入式微内核操作系统开发的,大部分嵌入式操作系统尚未实现动态加载技术。然而,目前featherphone的市场占有率仍很高,featherphone的应用开发方式通常有两种一种使用JAVA语言进行开发,另一种静态链接到版本之中。其中,JAVA是一种解释性语言,执行速度慢,同时还需要JAVA虚拟机的支持;而对于通过传统的应用与移动电话版本进行静态链接,以编译生成可执行文件来讲,文件越大需求的硬件资源,如随机存取存储器(RAM)或者非易失性或非闪存(NORFLASH)的容量就越大,且由于在调试过程中,经常会修改代码,每次修改都要对整个移动电话版本进行重新链接、烧录、加载操作,因此,修改代码所花费的时间甚至比调试代码的时间还多,严重影响了应用开发调试的效率。此外,当代码直接运行于具有N0RFLASH的移动电话时,因烧录时间较长而使得上述现象更为严重,应用开发调试的效率尤为低。同时,电信运营商还有动态升级应用的要求,而静态链接的应用却无法进行动态升级。目前,在微内核操作系统中实现了动态链接技术,这使得软件开发效率得以提高,按需加载以节省硬件资源,还可以随时为移动电话增加新功能。其中,动态加载过程主要包括计算并分配加载代码所需内存、符号解析、代码重定位三个过程。然而,现有技术在重定位过程中,当函数调用者与被调用者地址距离太远而超出跳转范围时,会造成动态加载失败、或动态加载动态应用文件运行发生错误。
发明内容有鉴于此,本发明的主要目的在于提供一种可重定位文件动态加载的方法及装置,能在函数调用距离超出跳转范围时,实现可重定位动态加载。为达到上述目的,本发明公开了一种可重定位文件动态加载的方法,包括解析可重定位文件获取信息,并在找到重定位节区后获取重定位目的地址,计算待重定位的地址及跳转距离;判断所述跳转距离是否超出短跳转范围,如果未超出短跳转范围,则将所述重定位目的地址填入待重定位的地址,进行重定位加载;如果超出短跳转范围,则添加veneer代码段,将超出短跳转范围的跳转间接跳转到重定位目的地址,进行重定位加载。其中,所述解析可重定位文件之前,该方法还包括生成系统符号表;按照可重定位文件的节区的属性,重组所述可重定位文件,计算加载动态应用文件的代码所需内存空间,并为加载代码分配内存空间以及计算出各代码段的起始地址,读取可重定位文件的节区内容并对应写入所分配的节区的内存空间;其中,所述重组可重定位文件为将可重定位文件所属文本TEXT、数据DATA、未初始化数据段BSS三段的节区按节区名称和节区序号进行升序排列,且优先按节区名称进行升序排列。上述方法中,所述获取重定位目的地址为解析可重定位文件获取符号节区的节区头,根据该节区头的sh_type字段对节区头表进行遍历,来查找可重定位文件的符号节区;根据所述符号节区的符号项的st_ShndX字段,判断可重定位文件的符号是否为未定义符号;当可重定位文件的符号为未定义符号时,查找所述系统符号表获得未定义符号的符号地址,将该未定义符号的符号地址作为动态应用文件的符号地址;所述动态应用文件引用的外部符号地址为重定位目的地址。其中,所述添加veneer代码段为生成veneer代码段,并将长跳转指令和引用的外部符号地址分别填充到veneer代码段中;将veneer代码段的起始地址填入待重定位的地址,形成一个有效的短跳转,该有效的短跳转指令指向veneer代码段;所述将超出短跳转范围的跳转间接跳转到重定位目的地址为通过有效的短跳转跳到veneer代码段,再通过veneer代码段的长跳转跳转到引用的外部符号地址。上述方法中,所述计算待重定位的地址为根据重定位信息,获取重定位的位置在所属节区的偏移;将获取的偏移加上所属节区的起始地址,得到待重定位的地址。其中,所述查找到重定位节区之后,该方法还包括判断是否遍历完重定位项,如果没有遍历完重定位项,则获取重定位目的地址;如果遍历完重定位项,则判断是否遍历完节区头表,如果未遍历完节区头表,则继续查找是否存在重定位节区;如果遍历完节区头表,则结束本次可重定位的动态加载过程。为实现上述方法,本发明提供一种可重定位文件动态加载的装置,包括解析模块、计算模块、查找模块、判断模块、重定位动态加载模块;其中,解析模块,用于解析可重定位文件获取信息;查找模块,用于根据所述解析模块解析得到的信息查找重定位节区、获取重定位目的地址;计算模块,用于计算待重定位的地址及跳转距离;判断模块,用于判断跳转距离是否超出短跳转范围,并将判断结果通知给重定位动态加载模块;重定位动态加载模块,用于将重定位目的地址填入待重定位的地址;以及用于添加veneer代码段,将超出短跳转范围的短跳转转换成一个有效的短跳转和一个长跳转,通过有效的短跳转跳转到veneer代码段再跳转到重定位目的地址,并进行重定位动态加载。其中,该装置还包括重组模块、内存划分模块;其中,重组模块,用于将可重定位文件所属的TEXT、DATA、BSS三段的节区按节区名称和节区序号进行升序排列,且优先按节区名称进行升序排列;内存划分模块,用于计算并划分加载动态应用文件的代码所需内存空间,并读取可重定位文件的节区内容并对应写入到该节区的内存空间;所述计算模块,还用于计算出各代码段和各节区的起始地址。该装置还包括第一遍历模块、第二遍历模块;其中,第一遍历模块,用于遍历节区头表,并在遍历完成时通知所述查找模块;第二遍历模块,用于遍历重定位项,并在遍历到重定位项时通知所述计算模块;在未遍历到重定位项时通知第一遍历模块;所述查找模块,还用于在查找到重定位节区时通知第二遍历模块。其中,所述重定位动态加载模块包括添加单元,用于添加veneer代码段;转换单元,用于将超出短跳转范围的短跳转转换成一个有效的短跳转和一个长跳转,有效的短跳转跳转到veneer代码段,通过veneer代码段的长跳转指令跳转到引用的外部符号地址。由以上技术方案可以看出,本发明提供的可重定位动态加载的方法,解决了动态加重定位过程中,函数调用者与被调用者地址距离太远,超出短跳转范围,造成动态加载失败的问题。换句话说就是,在进行可重定位动态加载时,本发明将超出跳转范围的短跳转转换成一个有效的短跳转和一个长跳转指令,从而实现了在函数调用距离超出跳转范围时的可重定位动态加载。另外,本发明采用应用与移动电话平台独立开发的方式,使得在需要对动态应用文件进行修改时,单独编译需要修改的动态应用文件即可,而无需对平台版本进行重新制作、烧录、加载等操作,如此,节省了大量的时间,可集中精力调试应用本身,极大的提高了应用开发效率。本发明将应用与移动电话平台由原来在PC侧进行链接改为在移动电话中进行链接,非常便于对移动电话平台功能进行扩展,如更新动态应用文件。并且,在运行时通过对已有的动态应用文件进行升级,能满足多方面的需求,如更新/下载最新的动态应用文件。综上所述,本发明可重定位动态加载的方法及装置,不仅能够提高软件开发效率,按需加载节省硬件资源,满足电信运营商的要求;还可以随时为移动电话增加新功能。尤其是,能够通过在跳转距离超出范围时,将超出范围的短跳转转换成一个有效的短跳转和一个长跳转,实现可重定位动态加载。图1为本发明可重定位文件动态加载的方法的实现流程示意图;图2为本发明代码重定位的流程示意图;图3为本发明可重定位文件动态加载的装置的组成示意图。具体实施例方式本发明的基本思想在于将超出跳转范围的短跳转转换成一个有效的短跳转和一个长跳转,实现在函数调用距离超出跳转范围时的可重定位动态加载。需要说明的是,本发明所采用的嵌入式设备大部分使用ARM处理器,动态加载的可重定位文件使用可执行链接格式(ELF,ExecutableandLinkingFormat)的链接视图,且在调试运行时采用的ELF格式的软件。其中,所述可重定位文件为PC侧的ARMCC编译器编译生成的目标文件,包含适合于与其他目标文件链接来创建可执行文件或者共享目标文件的代码和数据。所述可重定位文件具有多种格式如Windows的可移植的执行体(PE,PortableExcutable)格式、Unix/Li皿x的ELF。这里,根据ARM即AdvancedRISCMachine结构体系可知,ARM链接器在链接过程中提供一些小代码段,用于实现ARM状态到thumb状态转换、以及长距离跳转,通常将这些小代码段称之为状态切换代码(veneer)。由于不同的编译器生成的可重位目标文件会有所不同,也就是说,veneer代码与编译器相关,比如GNU编译器套装(GCC,GNUCompilerCollection)编译器具有-mlong选项,可以直接将跳转指令编译成长跳转。而低版本的ARMCC编译器不具有类似的属性,生成的可重定位文件都是短跳转指令,跳转范围在+32M-32M内,只能在ARMLINK链接器链接过程中根据需要将跳转转化成长跳转。动态加载文件的内存地址通常是在移动电话系统堆内存中进行分配,使用ARMCC编译器生成的可重定位文件,但是,当加载重定位目的地址与系统代码的地址距离太远,重定位过程中就可能出现函数调用者与被调者距离超出短跳转的范围,这样重定位就会失败。因此,在重定位过程中,需要将超出跳转范围的短跳转转换成长跳转指令,即生成veneer代码段,其中veneer代码段的作用是实现长距离跳转。根据ARM结构体系可知,长跳转可以通过直接向PC寄存器赋值来实现,但直接将短跳转指令改换成使用立即数即符号的地址,对PC赋值指令会带来一个问题每个立即数由一个八位常数循环右移偶数位得到,并不是每一个32位常数都是合法的立即数。那么,需要采用一种间接方法,将超出范围的短跳转转换成一个有效的短跳转和一个长跳转。因此,本发明采用veneer代码实现该长跳转,其中veneer代码占用两条汇编指令即八个字节,前四个字节存放长跳转指令,后四个字节存放动态应用文件引用的外部符号地址即重定位目的地址。如此,在重定位超出短跳转距离范围的外部符号时,通过有效的短跳转跳转到veneer代码,借助veneer代码段的长跳转指令,跳转到动态应用文件引用的外部符号地址,来实现动态加载。其中,所述有效的短跳转是指未超出短跳转范围的跳转。为使本发明上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施例对本发明作进一步详细的说明。本发明可重定位动态加载的实现,相当于在移动电话的嵌入式微内核操作系统中提供一个简化的加载链接器,使得动态应用文件的开发方式、函数调用关系与静态应用的基本一致,且无需改动所述动态应用文件。这里,本发明可重定位文件动态加载的方法如图l所示,主要包括如下步骤步骤101,生成系统符号表;其中,所述系统符号表主要组成部分包括符号名称和符号地址,系统符号表由移动电话平台(以下简称平台)生成,其生成过程包括将静态版本对外提供的符号名称及符号地址绑定在一起,组成静态数组;在移动电话系统初始化时,将该静态数组按哈希表的方式组织起来,供动态加载动态应用文件时进行查询。其中,该静态数组的生成可由数组生成工具通过二次编译生成,即第一次编译时,将该静态数组设为空,并将平台版本编译链接生成带符号信息的可执行文件,扫描该可执行文件获取符号名称,进而生成该静态数组;在进行二次编译时,通过编程语法得到符号地址,由编译器将符号地址填入所述静态数组;然后,在移动电话系统初始化时,将静态数组以哈希表的形式存储,以便于后续进行符号查找。步骤102,解析可重定位文件并进行重组,计算加载动态应用文件的代码所需内存空间;本步骤中,可重定位动态加载的装置根据节区头的sh_type等字段解析可重定位文件,遵守ELF文件格式。抽取解析得到的运行、重定位等信息读入内存,按照可重定位文件的节区的属性等信息进行重新组合,并计算加载动态应用文件的代码所需内存空间。需要说明的是,可执行文件如动态应用文件由文本(TEXT)、数据(DATA)、未初始化数据段(BSS,BlockStartedbySymbol)三段组成,其中,TEXT段用于放置编译时确定的动态应用文件代码,为只读格式;DATA段用于存放在编译阶段就能确定的数据,可读可写,DATA段是通常所说的静态存储区,赋了初值的全局变量和静态变量存放在这个区域,常量也存放在这个区域;BSS段是定义而没有赋初值的全局变量和静态变量。主要的重组过程为所述可重定位文件采用ELF的链接视图,于是先根据可重定位文件的节区头表的sh_type及sh_flag两字段确定所属段类型,再将TEXT段、DATA段及BSS段内的节区头表按一定顺序如按节区名称和节区序号进行升序排列,且优先按节区名称进行升序排列,即若节区名称相同,则再按节区序号进行升序排列。然后,根据节区头表的节区对齐约束sh—addralign字段及节区大小sh_siZe字段,分别计算出各代码段所需内存大小及总内存大小。其中,所述节区头表由ELF文件格式决定,包括很多节区头,是从可重定位文件复制到内存中的,在重定位结束后才被释放。需要指出的是,由于不同的链接器或不同的链接器版本串联的方式也会有所不同,于是为了方便调试动态应用文件以及不影响动态应用文件的运行,需要使TEXT段、DATA段及BSS段内的节区排序方式与PC侧链接器串联的方式保持一致。这里,将TEXT段内节区头表按一定顺序串联起来,主要是为了与PC侧链接器生成的顺序一致,而PC侧链接器对DATA段及BSS段是按节区序号进行排序的。步骤103,为加载代码分配所需的内存空间并计算出各代码段的起始地址,读取可重定位文件的节区内容并对应写入所分配的节区的内存空间;这里,可重定位动态加载的装置计算得到加载代码所需的内存空间后,为加载代码分配所需的内存空间,并根据每个节区的大小、排序及地址等信息计算出各代码段及各节区的起始地址。根据节区头表的sh_offSet字段及sh_size字段,将属于TEXT、DATA、BSS三段的节区内容从可重定位文件直接读取到该节区的内存空间。步骤104,解析可重定位文件获取信息,查找动态应用文件引用的外部符号地址;这里,所述信息包括字符串信息、符号信息、节区信息、重定位信息,其中,该重定位信息是由ELF文件格式确定的,所述动态应用文件引用的外部符号地址为重定位目的地址。ELF文件规定,目前可重定位文件除了所具有的普通节区外,只含有一个符号节区,通过该符号节区可查找到该重定位文件的符号,该符号为动态应用文件使用的函数或者变量。具体地,解析可重定位文件获取符号节区头,根据节区头的sh_type字段对节区头表进行遍历,来查找可重定位文件的符号节区;该符号节区头的shjink字段则表明符号对应的字符串节区索引,该字符串索引用于在字符串节区中定位符号名称,通过所述字符串节区索引,可在节区头表中找到对应的字符串节区在文件中的位置,然后将该字符串节区拷入内存,重定位过程中会使用到该字符串节区,使用完该字符串节区后将其释放删除。而符号节区是由很多符号项组成的,其中,该符号项的st_ShndX字段则表明符号定义所在的节区,通过该st_ShndX字段还可以判断所述符号是未定义的还是已定义的1)对于已定义符号,则根据符号定义所在的节区起始地址和符号项的st—value字段,获取符号地址并将符号信息添加到动态应用文件的哈希符号表即动态应用文件符号表中,供后续对动态应用文件的函数调用。其中,所述符号信息是在动态加载过程中组织起来的,包括符号名称及符号地址。例如需要调用动态应用文件对外提供的接口时,可以通过函数名即符号名称查找所述动态应用文件符号表,获取动态应用文件的函数地址。此处,所述已定义符号分为本地符号和全局符号,二者可根据符号项的st_info字段进行区别。并且,加载时可以只将全局符号加入所述动态应用文件符号表中,因为本地符号对动态应用文件的加载、运行及调试的影响较小。2)对于未定义符号,则通过查找系统符号表,获得未定义符号的符号地址。该未定义符号为动态应用文件引用的外部符号。这里,未定义符号是重定位的关键,如果找不到未定义的符号,则可重定位文件加载应为失败,即使仍继续加载成功,动态应用文件也不能确保正确运行。3)根据符号项的个数,在内存中建立起一个符号数组,将符号索引与计算或查找得到的符号地址、符号类型绑定在一起,符号索引与数组下标一一对应,供后续重定位时使用。重定位项r_info字段的高24位即r_info>>8表示重定位项对应的符号在符号节区的索引,通过该索引查找该符号数组即可找到符号的绝对地址。该符号数组在重定位结束后才被释放。符号数组是符号节区在内存中的表现形式。步骤105,查找重定位节区,并根据查找到的重定位节区的重定位信息,计算待重定位的地址及跳转距离;其中,待重定位地址给出了重定位动作所适用的绝对地址,重定位则是将符号引用与符号定义进行连接的过程。步骤106,判断所述跳转距离是否超出短跳转范围,如果未超出短跳转范围,则执行步骤107;如果超出短跳转范围,则执行步骤108;步骤107,将动态应用文件引用的外部符号地址填入待重定位的地址,进行重定位动态加载;在动态加载过程中,代码重定位是将符号引用与符号地址进行链接的过程,例如当程序调用了一个函数时,相关的调用指令必须把控制传输到适当的目标执行地址。在系统符号表中查找到的未定义符号的符号地址后,将所述未定义符号的符号地址填入待重定位的地址。其中,该未定义符号即动态应用文件引用的外部符号的绝对地址,也是进行重定位的目的地址。步骤108,添加veneer代码段,将超出范围的短跳转转换成一个有效的短跳转和一个长跳转,通过有效的短跳转跳转到veneer代码段上,借助veneer代码段的长跳转指令跳转到所引用的外部符号地址,进行重定位动态加载。在重定位过程中,若出现超出范围的短跳转,则需要将超出范围的短跳转转换成一个有效的短跳转指令和一个长跳转指令,即生成veneer代码段,该veneer代码段占用两条汇编指令即八个字节,前四个字节存放长跳转指令,后四个字节存放真正的重定位目的地址即动态应用文件引用的外部符号的绝对地址。如此,可使有效的短跳转指令指向veneer代码段,并通过veneer代码段的长跳转指令跳转到目的地址,实现长距离跳转,从而实现动态加载。其中,重定位过程包括以下两种方案1、对节区头表进行两次遍历第一次累计超出短跳转范围的次数,进而分配所有veneer代码段所需空间;第二次则进行重定位,将超出短跳转范围的短跳转重定位到对应的veneer代码段的长跳转指令所在地址,并填充veneer代码段。n、对节区头表进行一次遍历,此时不再精确统计超出短跳转范围的次数,而是根据动态应用文件引用的外部符号数为veneer代码段分配较大的空间,并将超出短跳转范围的短跳转重定位到对应的veneer代码段的长跳转指令所在地址,并填充veneer代码段。其中,veneer代码段不仅适用于长距离跳转,还适用于ARM状态与thumb状态之间的切换。应用于ARM状态与thumb状态之间切换时,所需要的代码段空间不变,代码段内容有所不同。相对于重定位方案I而言,重定位方案II则是一种更加优化,这是因为方案I需要两次遍历节区头表,所需要时间更多。此外,因为只要引用相同的符号,生成的veneer代码段就是相同的,所以方案11将相同的veneer代码段合并,而方案I没有将相同的veneer代码段合并,同一个符号可能会被多次引用,重复的veneer代码段很多。因此,相对于方案II而言,方案I所使用的空间更多。下面结合图2,对重定位方案II给出的代码重定位过程作进一步描述,其主要包括以下步骤步骤201,判断是否遍历完可重定位文件的节区头表,如果没有遍历完毕,则执行步骤202;如果遍历完毕,则执行步骤209;其中,遍历可重定位文件的节区头表中的所有项,来查找重定位节区。这里,所述重定位节区是指可重定位文件中的节区的属性为可重定位的普通节区。其中,所述重定位节区只对应一个代码节区,由多个重定位项组成,用于保存修改其他节区内容的信息,即提供如何对代码节区进行修改的信息。步骤202,判断所遍历的节区是否为重定位节区,若不是重定位节区,则返回执行步骤201;若是重定位节区,则执行步骤203;可重定位动态加载的装置根据节区头的sh_type字段,遍历节区头表可以查找到重定位节区。其中,重定位节区会引用两个其它节区符号节区、要修改的节区,重定位节区头的sh」nfo字段和sh_link字段成员给出进行重定位的数据关系,重定位节区头的sh_info字段表明适用的节区索引,sh—link字段表明对应的符号节区索引。由于目前ELF文件格式规定,一个ELF文件只有一个符号节区,因此shjink字段可以不予使用。步骤203,判断是否遍历完重定位项,如果遍历完毕,则返回执行步骤201;如果没有遍历完毕,则执行步骤204;根据可重定位节区中的重定位项的个数,来判断是否遍历完重定位项。其中,可重定位节区中的重定位项的个数是根据重定位节区头中记录的重定位节区的大小、重定位项的大小来计算得到的,即重定位项的个数=重定位节区的大小/重定位项的大小其具体的计算方法可参见ELF文件格式的相关规定。这里,重定位项为可重定位文件所包含的如何修改其节区内容的信息,从而允许可执行文件和共享目标文件保存进程的程序映像的正确信息。步骤204,读取重定位信息,计算待重定位的地址;所述重定位项重定位表项描述如何修改后面的指令和数据字段,包括r—offset字段、r」nfo字段等成员。其中,r—offset字段给出了重定位动作所适用的位置,给出受影响的存储单位的第一个字节的偏移。对于一个可重定位文件而言,r—offset的取值是从节区头部开始到将被重定位影响的存储单位之间的字节偏移。对于可执行文件或者共享目标文件而言,其取值是被重定位影响到的存储单元的虚拟地址。而r」nfo字段给出要进行重定位的符号表索引,以及将实施的重定位类型。例如,一个调用指令的重定位项将包含被调用函数的符号表索引。本实施例中,根据重定位信息,获取重定位的位置在所属节区的偏移。重定位项的r_0ffSet字段表明重定位的位置在所属节区的偏移,该偏移加上所属节区的起始地址,可定位到待重定位的地址。其中,所属节区为待重定位的节区。这里,重定位项的rjnfo字段具有两个含义,占四个字节。其中,该rjnfo字段的低8位即(unsignedchar)rjnfo表示重定位项的类型,不同的重定位项的类型有不同的重定位规则,具体请参照ELF格式的相关规则。r_info字段的高24位即r_info>>8则表示重定位项对应的符号在符号节区的索引,通过该符号节区的索引可找到符号的绝对地址。该绝对地址为相对于0的地址,通过地址跳转来实现函数调用。步骤205,根据重定位项的类型,按照不同的规则,计算跳转距离;所述重定位类型给出了需要修改以及如何计算修改取值的方法,其中,所述重定位项的类型以及计算跳转距离的过程,请参照ELF文件格式的相关规定,此处不再赘述。步骤206,判断跳转距离是否超出短跳转范围,如果超出短跳转范围,则执行步骤207;如果未超出短跳转范围,则执行步骤208;本实施例中,所述短跳转范围为+32M_32M。步骤207,添加veneer代码段,间接跳转到重定位目的地址,然后返回步骤203;其中,veneer代码空间根据外部引用符号数,通过一次性分配如采用伪代码pc,=pSymAdrs;dcdpSymAdrs等来添加veneer代码段,将veneer代码段的起始地址填入所述待重定位的地址,形成一个有效的短跳转,并将长跳转指令和引用的外部符号绝对地址分别填充到veneer代码段中。这样,有效的短跳转指令指向veneer代码段,通过veneer代码段的长跳转指令,进而间接跳转到所引用的外部符号地址,即重定位目的地址。其中,所述外部引用符号数可在判断是已定义符号还是未定义符号时进行累加,该未定义符号即为引用的外部符号。需要指出的是,为节省空间,本步骤也可先寻找是否存在已生成的veneer代码段,如果存在,则不必再生成veneer代码段,直接将该veneer代码段起始地址填入待重定位的地址即可。步骤208,直接修改代码段指令进行重定位,然后返回步骤203;其中,所述代码段指令为指重定位目的地址所容纳的指令。在跳转距离未超出跳转范围时,直接将修改代码段指令是指将引用的外部符号地址填入待重定位的地址。具体的填入方式参照ELF文件格式的规定。步骤209,结束本次代码重定位流程。对于上述各实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其他顺序或者同时进行。为实现上述方法,本发明还提供一种可重定位文件动态加载的装置,如图3所示,包括解析模块、计算模块、查找模块、判断模块、重定位动态加载模块;其中,解析模块,用于解析可重定位文件获取信息;查找模块,用于根据所述解析模块解析得到的信息查找重定位节区、获取重定位目的地址;计算模块,用于计算待重定位的地址及跳转距离;判断模块,用于判断跳转距离是否超出短跳转范围,并将判断结果通知给重定位动态加载模块;重定位动态加载模块,用于将重定位目的地址填入待重定位的地址,以及用于添加veneer代码段;将超出短跳转范围的短跳转转换成一个有效的短跳转和一个长跳转,通过有效的短跳转到veneer代码段,借助veneer代码段的长跳转指令跳转到重定位目的地址,并进行重定位动态加载。上述装置还包括重组模块、内存划分模块;其中,重组模块,用于将可重定位文件所属的TEXT、DATA、BSS三段的节区按节区名称和节区序号进行升序排列,且优先按节区名称进行升序排列;内存划分模块,用于计算并划分加载动态应用文件的代码所需内存空间,并读取可重定位文件的节区内容并对应写入到该节区的内存空间;相应的,所述计算模块,还用于计算出各代码段和各节区的起始地址。该装置还包括第一遍历模块、第二遍历模块;其中,第一遍历模块,用于遍历节区头表,并在遍历完成时通知所述查找模块;第二遍历模块,用于遍历重定位项,并在遍历到重定位项时通知所述计算模块;在未遍历到重定位项时通知第一遍历模块。相应的,所述查找模块,还用于在查找到重定位节区时通知第二遍历模块。其中,所述重定位动态加载模块包括添加单元,用于添加veneer代码;转换单元,用于将超出范围的短跳转转换成一个有效的短跳转和一个长跳转,通过有效的短跳转到veneer代码段,借助veneer代码段的长跳转指令,跳转到引用的外部符号地址。在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述即可。以上所述,仅为本发明的较佳实施例而已,只是用来说明和解释本发明,并非用于限定本发明的保护范围。在本发明的精神和权利要求保护范围之内,对本发明所作的任何修改、等同替换,都落入本发明的保护范围。权利要求一种可重定位文件动态加载的方法,其特征在于,包括解析可重定位文件获取信息,并在找到重定位节区后获取重定位目的地址,计算待重定位的地址及跳转距离;判断所述跳转距离是否超出短跳转范围,如果未超出短跳转范围,则将所述重定位目的地址填入待重定位的地址,进行重定位加载;如果超出短跳转范围,则添加veneer代码段,将超出短跳转范围的跳转间接跳转到重定位目的地址,进行重定位加载。2.根据权利要求1所述的可重定位文件动态加载的方法,其特征在于,所述解析可重定位文件之前,该方法还包括生成系统符号表;按照可重定位文件的节区的属性,重组所述可重定位文件,计算加载动态应用文件的代码所需内存空间,并为加载代码分配内存空间以及计算出各代码段的起始地址,读取可重定位文件的节区内容并对应写入所分配的节区的内存空间;其中,所述重组可重定位文件为将可重定位文件所属文本TEXT、数据DATA、未初始化数据段BSS三段的节区按节区名称和节区序号进行升序排列,且优先按节区名称进行升序排列。3.根据权利要求2所述的可重定位文件动态加载的方法,其特征在于,所述获取重定位目的地址为解析可重定位文件获取符号节区的节区头,根据该节区头的sh_type字段对节区头表进行遍历,来查找可重定位文件的符号节区;根据所述符号节区的符号项的st_ShndX字段,判断可重定位文件的符号是否为未定义符号;当可重定位文件的符号为未定义符号时,查找所述系统符号表获得未定义符号的符号地址,将该未定义符号的符号地址作为动态应用文件的符号地址;所述动态应用文件引用的外部符号地址为重定位目的地址。4.根据权利要求1所述的可重定位文件动态加载的方法,其特征在于,所述添加veneer代码段为生成veneer代码段,并将长跳转指令和引用的外部符号地址分别填充到veneer代码段中;将veneer代码段的起始地址填入待重定位的地址,形成一个有效的短跳转,该有效的短跳转指令指向veneer代码段;所述将超出短跳转范围的跳转间接跳转到重定位目的地址为通过有效的短跳转跳到veneer代码段,再通过veneer代码段的长跳转跳转到引用的外部符号地址。5.根据权利要求1至4中任一项所述的可重定位文件动态加载的方法,其特征在于,所述计算待重定位的地址为根据重定位信息,获取重定位的位置在所属节区的偏移;将获取的偏移加上所属节区的起始地址,得到待重定位的地址。6.根据权利要求1所述的可重定位文件动态加载的方法,其特征在于,所述查找到重定位节区之后,该方法还包括判断是否遍历完重定位项,如果没有遍历完重定位项,则获取重定位目的地址;如果遍历完重定位项,则判断是否遍历完节区头表,如果未遍历完节区头表,则继续查找是否存在重定位节区;如果遍历完节区头表,则结束本次可重定位的动态加载过程。7.—种可重定位文件动态加载的装置,其特征在于,包括解析模块、计算模块、查找模块、判断模块、重定位动态加载模块;其中,解析模块,用于解析可重定位文件获取信息;查找模块,用于根据所述解析模块解析得到的信息查找重定位节区、获取重定位目的地址;计算模块,用于计算待重定位的地址及跳转距离;判断模块,用于判断跳转距离是否超出短跳转范围,并将判断结果通知给重定位动态加载模块;重定位动态加载模块,用于将重定位目的地址填入待重定位的地址;以及用于添加veneer代码段,将超出短跳转范围的短跳转转换成一个有效的短跳转和一个长跳转,通过有效的短跳转跳转到veneer代码段再跳转到重定位目的地址,并进行重定位动态加载。8.根据权利要求7所述的可重定位文件动态加载的装置,其特征在于,该装置还包括重组模块、内存划分模块;其中,重组模块,用于将可重定位文件所属的TEXT、DATA、BSS三段的节区按节区名称和节区序号进行升序排列,且优先按节区名称进行升序排列;内存划分模块,用于计算并划分加载动态应用文件的代码所需内存空间,并读取可重定位文件的节区内容并对应写入到该节区的内存空间;所述计算模块,还用于计算出各代码段和各节区的起始地址。9.根据权利要求7或8所述的可重定位文件动态加载的装置,其特征在于,该装置还包括第一遍历模块、第二遍历模块;其中,第一遍历模块,用于遍历节区头表,并在遍历完成时通知所述查找模块;第二遍历模块,用于遍历重定位项,并在遍历到重定位项时通知所述计算模块;在未遍历到重定位项时通知第一遍历模块;所述查找模块,还用于在查找到重定位节区时通知第二遍历模块。10.根据权利要求7或8所述的可重定位动态加载的装置,其特征在于,所述重定位动态加载模块包括添加单元,用于添加veneer代码段;转换单元,用于将超出短跳转范围的短跳转转换成一个有效的短跳转和一个长跳转,有效的短跳转跳转到veneer代码段,通过veneer代码段的长跳转指令跳转到引用的外部符号地址。全文摘要本发明公开一种可重定位文件动态加载的方法,包括解析可重定位文件获取信息,并在找到重定位节区后获取重定位目的地址、计算待重定位的地址及跳转距离;判断跳转距离是否超出短跳转范围,如果未超出短跳转范围,则将所述重定位目的地址填入待重定位的地址,进行重定位加载;如果超出短跳转范围,则添加veneer代码段,将超出短跳转范围的跳转间接跳转到重定位目的地址,进行重定位加载。相应地,本发明提供一种可重定位动态加载的装置,包括解析模块、计算模块、查找模块、判断模块、重定位动态加载模块。因此,本发明能在函数调用距离超出跳转范围时,实现可重定位动态加载。文档编号G06F9/445GK101697131SQ20091021062公开日2010年4月21日申请日期2009年11月4日优先权日2009年11月4日发明者何海建,武晓慧,范伟申请人:中兴通讯股份有限公司;
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1