一种提取和组织arm程序重定位信息的方法
【专利摘要】一种提取和组织ARM程序重定位信息的方法,包括二次链接、提取重定位信息、以及组织重定位信息三个过程,这三个过程需要集成在ARM程序编译链接的过程中执行;二次链接过程发生在ARM程序第1次链接成功完成,生成原始目标文件之后;二次链接过程,是修改程序的原始定位配置信息,然后用修改后的定位配置信息对原编译产生的中间文件进行重链接。其实施过程不需要改造任何既有的开发环境和工具。提取出来的重定位信息也不依赖任何操作系统和软件环境,可以容易地应用于各种以ARM处理器为核心硬件平台的产品上。尤其适合于无法运行操作系统的产品上,使其能够实现程序运行时重定位的功能,进而丰富这些产品上的软件应用方法。
【专利说明】一种提取和组织ARM程序重定位信息的方法
【【技术领域】】
[0001]本发明属于计算机软件【技术领域】,具体涉及一种提取和组织ARM程序重定位信息的方法。
【【背景技术】】
[0002]在计算机软件中,经常会由于函数库的动态加载、程序的动态加载运行等需求,使得软件目标机器指令在运行时的地址和在开发编译时的地址不一致。而软件中的一些机器指令需要使用其他指令的运行时地址信息才能正常工作。比如函数指针的调用,这个软件功能在机器指令中就需要获取函数指针指向的函数的运行时地址信息。因此,当软件目标机器指令在运行时和开发时地址不同的情况下,必须使用重定位技术对软件指令中的地址信息进行修正后,软件才能正常工作。
[0003]在一些完整的操作系统中,例如Windows、Unix等操作系统,系统本身设计支持了重定位功能,当使用这些操作系统开发产品时,无须为重定位功能进行特殊设计。但是这些操作系统对产品的资源要求比较多,当遇到一些硬件规格比较低端的产品时,无法使用这些操作系统作为基础软件环境,必须使用无操作系统的裸机环境运行软件。此时就有必要在这样的环境中开发实现重定位技术,用于实现函数动态库和软件动态加载运行等功能需求。
[0004]重定位功能需要重定位信息的支持。重定位信息一般在程序编译链接时产生。Windows、Unix等操作系统上的软件文件除了软件的机器指令外,还包括一些文件格式信息和附加信息,重定位信息就包括在这些附加信息里面。这些信息都在编译链接时产生。而无操作系统的产品上的软件一般由纯粹的机器指令构成,编译链接器不会为其提供重定位信息。如果无操作系统的软件沿用Wind0WS、Unix等系统的重新位信息,就意味着软件实现上要去解析Windows、Unix等系统上的程序文件格式、重定位信息格式、以及重定位方法,其实现的复杂度较高,软件运行时消耗也可能比较大。如果要求编译时产生特定格式的重定位信息,则要改造编译链接器,普通的企业也无法实现该目标。
[0005]有鉴于此,本发明人针对现有技术的缺陷深入研究,遂有本案产生。
【
【发明内容】
】
[0006]本发明所要解决的技术问题在于提供一种简单易行的提取和组织ARM程序重定位信息的方法。
[0007]本发明是这样实现的:
[0008]一种提取和组织ARM程序重定位信息的方法,包括二次链接、提取重定位信息、以及组织重定位信息三个过程,这三个过程需要集成在ARM程序编译链接的过程中执行;所述二次链接过程发生在ARM程序第I次链接成功完成,生成原始目标文件之后;所述二次链接过程,是修改程序的原始定位配置信息,然后用修改后的定位配置信息对原编译产生的中间文件进行重链接。
[0009]进一步地,所述二次链接过程由修改定位配置信息和重链接两个子过程构成;
[0010]所述修改定位配置信息过程的工作是修改程序的定位配置信息,在一般的编译链接器中,程序定位配置信息以命令行参数,或者分散描述文件,或者等闲的配置文件和参数构成,修改定位配置信息过程检索第I次链接时使用的程序的原始定位配置信息,将其中绝对定位地址信息均加上一个统一的参考值;修改定位配置信息过程的工作输出是修改后的程序的新定位配置信息;
[0011]所述重链接过程的工作是执行重链接,以新定位配置信息、原编译时产生的中间文件、第I次链接时使用的所有库和组件作为输入,调用第I次链接时的链接器进行链接,得到新的目标文件。
[0012]进一步地,所述提取重定位信息,以新定位配置信息和新的目标文件为输入,打开新的目标文件和原始目标文件,分别从新的目标文件和原始目标文件中逐4字节读取数据,每读取出I对4字节数据后,就用从新的目标文件中读取的数据减去从原始目标文件中读取的数据,将得到的差值与参考值进行比较;若差值满足等于参考值的移位运算的结果,则记录下本次比较的信息,即数据在文件中的偏移地址、对比数据的字节长度、以及差值是参考值移位运算的位数参数;若差值不满足参考值的移位运算结果关系,则将本次读取出来的I对4字节数据拆分成2对2字节数据,每对2字节数据同上述过程做减法运算,并判断差值和参考值的关系,对满足关系的情况记录下偏移地址、对比数据的字节长度、移位运算的位数参数;如此循环读取和比较新的目标文件和原始目标文件中的所有数据,当新的目标文件和原始目标文件完全比对完成后,提取重定位信息过程完成,输出所有记录下的偏移地址、对比数据的字节长度、移位运算的位数参数信息形成的重定位信息集合。
[0013]进一步地,所述参考值是一个无符号整数值,是新的定位配置信息中绝对定位地址和原始定位配置信息中绝对定位地址的差值,所述绝对定位地址的参考值必须是相同值,参考值的取值至少需要是4字节的整数倍。
[0014]进一步地,所述组织重定位信息以重定位信息集合为输入,将其中的数据按照对比数据的字节长度、位数参数相同为原则进行分组,每一组为一个重定位信息组,最终将所有的重定位信息组集合形成程序完整重定位信息;所述重定位信息组中至少包括一份对比数据的字节长度、位数参数信息,以及该组中所有的偏移地址信息。
[0015]进一步地,所述重定位信息组中为每条偏移地址信息再记录下以其值为文件偏移地址的原始目标文件或新的目标文件中的对比数据的字节长度的数据值信息。
[0016]本发明的优点在于:本发明提供了一种简单易行的ARM程序重定位信息的提取和组织方法。其实施过程不需要改造任何既有的开发环境和工具。提取出来的重定位信息也不依赖任何操作系统和软件环境,可以容易地应用于各种以ARM处理器为核心硬件平台的产品上。尤其适合于无法运行操作系统的产品上,使其能够实现程序运行时重定位的功能,进而丰富这些产品上的软件应用方法。
【【专利附图】
【附图说明】】
[0017]下面参照附图结合实施例对本发明作进一步的描述。
[0018]图1是本发明在ARM程序编译链接的过程中的配合关系示意图。
[0019]图2是本发明中二次链接工作过程示意图。
[0020]图3是本发明中提取重定位信息工作过程示意图。
【【具体实施方式】】
[0021]重定位信息包括需要重定位的指令的位置以及重定位时的修正方法两个部分。
[0022]软件程序的机器指令中的确切地址信息,是在程序被链接时产生的。编译器和链接器的工作存在一个事实:既同一批编译出来的几个中间文件、库、以及组件,用相同的配置信息进行两次链接得到两个整体程序时,两个整体程序的目标指令流是完全一致的;同一批编译出来的几个中间文件、库、以及组件,用定位配置不同但其他配置完全相同的配置信息进行两次链接得到两个整体程序时,两个整体程序的目标指令流的序列是完全相同的,仅地址相关的部分指令和数据不同的。基于此事实,将程序经过地址配置不同但其他配置完全相同的配置信息进行两次链接,得到两份整体程序,对其进行逐字节比对,其差异位置就是要进行重定位的指令的位置。
[0023]在ARM处理器上,机器指令存在几个关键特征。其一,是ARM处理器指令总是定长的,即对于ARM指令集指令总是4字节长度,Thumb/Thumb2指令集指令总是2字节或4字节长度。其二,是ARM处理器中,ARM指令集指令的地址总是4字节对齐的;Thumb/Thumb2指令集的2字节起始指令总是4字节对齐,4字节指令的地址也要求4字节对齐;所有指令中用到的代表地址信息的常数据所在地址必须4字节对齐。其三,ARM处理器指令机器码总遵循“机器码+操作数”的格式,如果机器指令需要用到的常数据在机器码的操作数的数位空间中可以完整表达时,指令用到的常数据就直接存在于指令机器码的操作数中。基于ARM处理器机器指令的这些特征,当仅有地址信息不同的两个程序,逐4字节进行比对的时候,差异处的4个字节按照32位无符号整数进行相减,得到的值将等于两个程序定位地址的差值或者是定位地址差值的移位运算的结果;当不满足该关系时,说明遇到的是2字节Thumb指令,则将差异处的4字节拆分成2个2字节,每2个字节按照16位无符号整数进行相减,得到的值与程序定位地址的差值也将满足上述关系。通过相减法得到的值与程序定位地址的差值的关系,就是重定时该地址位置上指令机器码的修正方法。
[0024]本发明的方法主要由二次链接601、提取重定位信息602、以及组织重定位信息603三个过程组成。这三个过程需要集成在ARM程序编译链接的过程中执行。这三个过程在整体过程中的配合关系如图1所示。
[0025]二次链接601过程发生在ARM程序第I次链接成功完成,生成原始目标文件641之后。二次链接601的主要工作是修改程序的原始定位配置信息642,然后用修改后的定位配置信息对原编译产生的中间文件进行重链接。因此二次链接601过程由修改定位配置信息611和重链接612两个子过程构成。二次链接601的工作过程如图2所示。
[0026]修改定位配置信息611过程的工作是修改程序的定位配置信息。在一般的编译链接器中,程序定位配置信息以命令行参数,或者分散描述文件,或者等闲的配置文件和参数构成。修改定位配置信息611过程检索第I次链接时使用的程序的原始定位配置信息642,将其中绝对定位地址信息均加上一个统一的参考值613。修改定位配置信息611过程的工作输出是修改后的程序的新定位配置信息614。
[0027]重链接612过程的工作是执行重链接。以新定位配置信息614、原编译时产生的中间文件643、第I次链接时使用的所有库和组件644作为输入,调用第I次链接时的链接器进行链接,得到新的目标文件615。
[0028]参考值613是一个无符号整数值,是新的定位配置信息中绝对定位地址和原始定位配置信息中绝对定位地址的差值。在同一次执行本发明的过程中,定位配置信息中可能涉及到一个以上的绝对定位地址,这些绝对定位地址的参考值613必须是相同值。参考值613的取值至少需要是4字节的整数倍。理想取值是程序在运行时可能被重定位到的所有运行地址的最大公约数的整数倍。例如,在一个软件环境中,程序总以4096 Byte的整数倍数值为地址进行重定位运行,那么参考值613的理想取值应该是4096的整数倍。
[0029]提取重定位信息602以新定位配置信息614和新的目标文件615为输入,过程如图3所示。该过程打开新的目标文件615和原始目标文件641,分别从新的目标文件615和原始目标文件中逐4字节读取数据,每读取出I对4字节数据后,就用从新的目标文件615中读取的数据减去从原始目标文件641中读取的数据,将得到的差值与参考值613进行比较。若差值满足等于参考值613的移位运算的结果,则记录下本次比较的信息,即数据在文件中的偏移地址621、对比数据的字节长度622、以及差值是参考值613移位运算的位数参数623。若差值不满足参考值613的移位运算结果关系,则将本次读取出来的I对4字节数据拆分成2对2字节数据,每对2字节数据同上述过程做减法运算,并判断差值和参考值613的关系,对满足关系的情况记录下偏移地址621、对比数据的字节长度622、位数参数623。如此循环读取和比较新的目标文件615和原始目标文件641中的所有数据,当新的目标文件615和原始目标文件641完全比对完成后,提取重定位信息602过程完成,输出所有记录下的偏移地址621、对比数据的字节长度622、位数参数623信息形成的重定位信息集合 624。
[0030]组织重定位信息603以重定位信息集合624为输入,将其中的数据按照对比数据的字节长度622、位数参数623相同为原则进行分组,每一组为一个重定位信息组。最终将所有的重定位信息组集合形成程序完整重定位信息632。
[0031]重定位信息组中至少包括一份对比数据的字节长度622、位数参数623信息,以及该组中所有的偏移地址621信息。可选的,重定位信息组中可以为每条偏移地址621信息再记录下以其值为文件偏移地址的原始目标文件641或新的目标文件615中的对比数据的字节长度622的数据值信息。
[0032]本发明提供了一种简单易行的ARM程序重定位信息的提取和组织方法。其实施过程不需要改造任何既有的开发环境和工具。提取出来的重定位信息也不依赖任何操作系统和软件环境,可以容易地应用于各种以ARM处理器为核心硬件平台的产品上。尤其适合于无法运行操作系统的产品上,使其能够实现程序运行时重定位的功能,进而丰富这些产品上的软件应用方法。
[0033]以上所述仅为本发明的较佳实施用例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换以及改进等,均应包含在本发明的保护范围之内。
【权利要求】
1.一种提取和组织ARM程序重定位信息的方法,其特征在于:包括二次链接、提取重定位信息、以及组织重定位信息三个过程,这三个过程需要集成在ARM程序编译链接的过程中执行;所述二次链接过程发生在ARM程序第I次链接成功完成,生成原始目标文件之后;所述二次链接过程,是修改程序的原始定位配置信息,然后用修改后的定位配置信息对原编译产生的中间文件进行重链接。
2.如权利要求1所述的一种提取和组织ARM程序重定位信息的方法,其特征在于: 所述二次链接过程由修改定位配置信息和重链接两个子过程构成; 所述修改定位配置信息过程的工作是修改程序的定位配置信息,在一般的编译链接器中,程序定位配置信息以命令行参数,或者分散描述文件,或者等效的配置文件和参数构成,修改定位配置信息过程检索第I次链接时使用的程序的原始定位配置信息,将其中绝对定位地址信息均加上一个统一的参考值;修改定位配置信息过程的工作输出是修改后的程序的新定位配置信息; 所述重链接过程的工作是执行重链接,以新定位配置信息、原编译时产生的中间文件、第I次链接时使用的所有库和组件作为输入,调用第I次链接时的链接器进行链接,得到新的目标文件。
3.如权利要求2所述的一种提取和组织ARM程序重定位信息的方法,其特征在于: 所述提取重定位信息,以新定位配置信息和新的目标文件为输入,打开新的目标文件和原始目标文件,分别从新的目标文件和原始目标文件中逐4字节读取数据,每读取出I对4字节数据后,就用从新的目标文件中读取的数据减去从原始目标文件中读取的数据,将得到的差值与参考值进行比较;若差值满足等于参考值的移位运算的结果,则记录下本次比较的信息,即数据在文件中的偏移地址、对比数据的字节长度、以及差值是参考值移位运算的位数参数;若差值不满足参考值的移位运算结果关系,则将本次读取出来的I对4字节数据拆分成2对2字节数据,每对2字节数据同上述过程做减法运算,并判断差值和参考值的关系,对满足关系的情况记录下偏移地址、对比数据的字节长度、移位运算的位数参数;如此循环读取和比较新的目标文件和原始目标文件中的所有数据,当新的目标文件和原始目标文件完全比对完成后,提取重定位信息过程完成,输出所有记录下的偏移地址、对比数据的字节长度、移位运算的位数参数信息形成的重定位信息集合。
4.如权利要求3所述的一种提取和组织ARM程序重定位信息的方法,其特征在于: 所述参考值是一个无符号整数值,是新的定位配置信息中绝对定位地址和原始定位配置信息中绝对定位地址的差值,所述绝对定位地址的参考值必须是相同值,参考值的取值至少需要是4字节的整数倍。
5.如权利要求2所述的一种提取和组织ARM程序重定位信息的方法,其特征在于: 所述组织重定位信息以重定位信息集合为输入,将其中的数据按照对比数据的字节长度、移位运算的位数参数相同为原则进行分组,每一组为一个重定位信息组,最终将所有的重定位信息组集合形成程序完整重定位信息;所述重定位信息组中至少包括一份对比数据的字节长度、位数参数信息,以及该组中所有的偏移地址信息。
6.如权利要求5所述的一种提取和组织ARM程序重定位信息的方法,其特征在于:所述重定位信息组中为每条偏移地址信息再记录下以其值为文件偏移地址的原始目标文件或新的目标文件中的对比数据的字节长度的数据值信息。
【文档编号】G06F9/44GK104239064SQ201410503962
【公开日】2014年12月24日 申请日期:2014年9月26日 优先权日:2014年9月26日
【发明者】林志伟 申请人:福建升腾资讯有限公司