一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

全局变量的重定位方法和装置与流程

2022-08-13 20:25:28 来源:中国专利 TAG:


1.本发明涉及动态加载技术,尤其涉及一种全局变量的重定位方法和装置。


背景技术:

2.在设备的操作系统运行过程中,会涉及到将程序和数据从外存或者网络加载到内存的过程,该过程即为动态加载。
3.在rtos(real time operating system,实时操作系统)系统中,通过编译器编译出可执行程序,再将可执行程序中的代码加载到内存的任意地址运行,即可实现rtos系统的动态加载。如果可执行程序支持包含全局变量的代码的动态加载,需要进行全局变量的地址的重定位。
4.全局变量的重定位依赖于重定位寄存器。在rtos系统中一般只含有一个重定位寄存器,如果需要对多个包含全局变量的代码进行动态加载,一个重定位寄存器无法满足多个全局变量的动态加载需求。


技术实现要素:

5.本发明提供一种全局变量的重定位方法和装置,旨在满足多个全局变量的动态加载需求。
6.一方面,本发明提供一种全局变量的重定位方法,包括:
7.获取第一可执行程序,所述第一可执行程序对全局变量的访问依赖重定位寄存器的重定位;
8.对所述第一可执行程序进行处理得到第二可执行程序,所述第二可执行程序对全局变量的访问不依赖重定位寄存器的重定位;
9.确定所述第一可执行程序中各个全局变量的相对地址,并根据所述第二可执行程序获取所述第二可执行程序中已初始化变量的首地址的第一加载地址;
10.根据所述第一加载地址以及每个所述全局变量的相对地址,确定每个所述全局变量的实际加载地址,并将每个所述相对地址修改为每个所述相对地址对应的实际加载地址。
11.在一实施例中,所述对所述第一可执行程序进行处理得到第二可执行程序的步骤包括:
12.生成所述第一可执行程序对应的反汇编文件;
13.扫描所述反汇编文件确定所述第一可执行程序中的各个第一指令,所述第一指令是所述重定位寄存器的重定位指令;
14.将各个所述第一指令替换为第二指令得到所述第二可执行程序,所述第二指令是无效指令。
15.在一实施例中,所述确定所述第一可执行程序中各个全局变量的相对地址的步骤包括:
16.根据所述反汇编文件获取每个所述第一指令对应的第一寄存器;
17.在所述反汇编文件中确定每个所述第一指令对应的目标指令,其中,所述第一指令对应的目标指令是向所述第一指令对应的第一寄存器赋值的指令;
18.根据每个所述目标指令获取各个所述全局变量的相对地址。
19.在一实施例中,所述根据所述第二可执行程序获取所述第二可执行程序中已初始化变量的首地址的第一加载地址的步骤包括:
20.将各个所述相对地址添加至所述第二可执行程序的头部位置得到第三可执行程序;
21.获取所述第二可执行程序中已初始化变量的首地址,并加载所述第三可执行程序得到所述首地址的第一加载地址。
22.在一实施例中,所述将各个所述相对地址添加至所述第二可执行程序的头部位置得到第三可执行程序的步骤包括:
23.在各个所述相对地址中去除重复的相对地址;
24.将去除重复相对地址的各个所述相对地址,添加至所述第二可执行程序的头部位置,得到第三可执行程序。
25.在一实施例中,所述将各个所述相对地址添加至所述第二可执行程序的头部位置得到第三可执行程序的步骤包括:
26.将各个所述相对地址添加至所述第二可执行程序的头部位置,并在所述第二可执行程序的尾部位置添加预设字符,得到所述第三可执行程序。
27.在一实施例中,所述获取第一可执行程序的步骤包括:
28.编译初始可执行程序;
29.将所述初始可执行程序与所述重定位寄存器进行连接,并在将所述初始可执行程序与所述重定位寄存器的编译选项设置为位置无关,得到所述第一可执行程序。
30.另一方面,本发明还提供一种全局变量的重定位装置,包括:
31.获取模块,用于获取第一可执行程序,所述第一可执行程序对全局变量的访问依赖重定位寄存器的重定位;
32.处理模块,用于对所述第一可执行程序进行处理得到第二可执行程序,所述第二可执行程序对全局变量的访问不依赖重定位寄存器的重定位;
33.确定模块,用于确定所述第一可执行程序中各个全局变量的相对地址,并根据所述第二可执行程序获取所述第二可执行程序中已初始化变量的首地址的第一加载地址;
34.所述确定模块,还用于根据所述第一加载地址以及每个所述全局变量的相对地址,确定每个所述全局变量的实际加载地址,并将每个所述相对地址修改为每个所述相对地址对应的实际加载地址。
35.另一方面,本发明还提供一种全局变量的重定位设备,包括:存储器和处理器;
36.所述存储器存储计算机执行指令;
37.所述处理器执行所述存储器存储的计算机执行指令,使得所述处理器执行如上所述的全局变量的重定位方法。
38.另一方面,本发明还提供一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机执行指令,所述计算机执行指令被处理器执行时用于实现如上所述的全局变
量的重定位方法。
39.另一方面,本发明还提供一种计算机程序产品,包括计算机程序,所述计算机程序被处理器执行时,实现如上所述的全局变量的重定位方法。
40.本发明提供的全局变量的重定位方法和装置,获取依赖重定位寄存器重定位全局变量的第一可执行程序,对第一可执行程序进行处理得到不依赖重定位寄存器重定位全局变量的第二可执行程序,根据第二可执行程序确定各个全局变量的相对地址,并根据第二可执行程序获取第二可执行程序中已初始化变量的首地址的第一加载地址,再根据第一加载地址以及每个全局变量的相对地址确定每个全局变量的实际加载地址,并将存放的相对地址修改为相对地址对应的实际加载地址完成全局变量的重定位。本发明中,通过依赖重定位寄存器重定位全局变量的第一可执行程序进行处理,得到不依赖重定位寄存器重定位全局变量的第二可执行程序,并基于第二可执行程序实现各个全局变量的重定位,消除了重定位寄存器影响第二可执行程序对多个全局变量的重定位,从而实现了多个全局变量的动态加载需求。
附图说明
41.此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理。
42.图1为本发明全局变量的重定位方法第一实施例的流程示意图;
43.图2为本发明全局变量的重定位方法第二实施例中步骤s20的细化流程示意图;
44.图3为本发明全局变量的重定位方法第三实施例中步骤s30的细化流程示意图;
45.图4为本发明全局变量的重定位方法第四实施例中步骤s30的细化流程示意图;
46.图5为本发明依赖重定位寄存器的可执行程序的变换示意图;
47.图6为本发明全局变量的重定位设备的模块示意图;
48.图7为本发明全局变量的重定位装置的结构示意图。
49.通过上述附图,已示出本公开明确的实施例,后文中将有更详细的描述。这些附图和文字描述并不是为了通过任何方式限制本公开构思的范围,而是通过参考特定实施例为本领域技术人员说明本公开的概念。
具体实施方式
50.这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本公开相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本公开的一些方面相一致的装置和方法的例子。
51.下面以具体地实施例对本发明的技术方案以及本技术的技术方案如何解决上述技术问题进行详细说明。下面这几个具体的实施例可以相互结合,对于相同或相似的概念或过程可能在某些实施例中不再赘述。下面将结合附图,对本发明的实施例进行描述。
52.参照图1,图1为本发明全局变量的重定位方法的第一实施例,全局变量的重定位方法包括以下步骤:
53.步骤s10,获取第一可执行程序,第一可执行程序对全局变量的访问依赖重定位寄
存器的重定位。
54.在本实施例中,执行主体是全局变量的重定位装置,为了便于描述,以下采用装置指代全局变量的重定位装置。装置可以是任意具有数据处理功能的终端设备。
55.装置获取第一可执行程序,第一可执行程序对全局变量的访问依赖重定位寄存器的重定位,也即第一可执行程序是依赖重定位寄存器进行重定位的可执行代码。重定位寄存器可以是r9寄存器。第一可执行程序可以通过arm编译器(amr编译器是以某个企业命名的)编译得到。arm编译可以通过ropi、rwpi等编译选项编译出可动态加载运行的代码,该代码定义为第一可执行程序。而第一可执行程序对全局变量的访问是通过r9寄存器进行重定位的。
56.装置编译出初始可执行程序,再将初始可执行程序与重定位寄存器进行连接,并在初始可执行程序与重定位寄存器的编译选项设置为位置无关,即可得到第一可执行程序,也即装置要在编译连接充电重定位寄存器时,将编译选项设置为位置无关,编译选项例如为ropi。具体的,在编译连接时需要指定ropi、rwpi编译选项,使编译出来的可执行代码具有代码位置无关特性,在动态加载代码时,ro(代码中的指令和常量)代码段可以直接加载到任意位置,rw(代码中的已初始化变量)数据段,需要根据rw加载的地址,将r9重定位寄存器设置到该地址,这样使全局变量的地址得以重新定位。
57.步骤s20,对第一可执行程序进行处理得到第二可执行程序,第二可执行程序对全局变量的访问不依赖重定位寄存器的重定位。
58.在本实施例中,需要满足多个全局变量的重定位。而装置中只有一个重定位寄存器,一个重定位寄存器只能进行一个全局变量的重定位。对此,装置需要切除第一可执行程序对重定位寄存器的依赖,使得切除依赖后的可执行程序能够多个全局变量进行访问。
59.装置可以对第一可执行程序进行处理得到第二可执行程序,第二可执行程序对全局变量的访问不依赖重定位寄存器的重定位。第一可执行程序中有指令,重定位寄存器可以通过这些指令使得第一可执行程序依赖重定位寄存器,装置可以无效化的处理这些指令,无效化处理后的第一可执行程序即为第二可执行程序,也即使得第二可执行程序对全局变量的访问不依赖重定位寄存器的重定位。
60.步骤s30,确定第一可执行程序中各个全局变量的相对地址,并根据第二可执行程序获取第二可执行程序中已初始化变量的首地址的第一加载地址。
61.第一可执行程序中存储有多个全局变量的相对地址,装置确定每个全局变量的相对地址。
62.装置进一步的获取第二可执行程序中已初始化变量的首地址rw的第一加载地址,第一加载地址即为rw的首地址被加载的地址。例如,装置加载第二可执行程序即可得到rw的首地址被加载的地址。rw的首地址是rw所占的存储区域中的第一个单元的地址。
63.步骤s40,根据第一加载地址以及每个全局变量的相对地址,确定每个全局变量的实际加载地址,并将每个相对地址修改为每个相对地址对应的实际加载地址。
64.装置基于第一加载地址以及每个全局变量的相对地址即可确定全局变量的实际加载地址。实际加载地址=相对地址 rw首地址的加载地址。装置可以计算出每个全局变量的存放地址,存放地址存储有全局变量的全局变量地址信息,全局变量地址信息包括有全局变量的相对地址,装置将每个相对地址修改为每个相对地址所对应的实际加载地址,即
可实现多个全局变量的重定位。
65.在本实施例提供的技术方案中,获取依赖重定位寄存器重定位全局变量的第一可执行程序,对第一可执行程序进行处理得到不依赖重定位寄存器重定位全局变量的第二可执行程序,根据第二可执行程序确定各个全局变量的相对地址,并根据第二可执行程序获取第二可执行程序中已初始化变量的首地址的第一加载地址,再根据第一加载地址以及每个全局变量的相对地址确定每个全局变量的实际加载地址,并将存放的相对地址修改为相对地址对应的实际加载地址完成全局变量的重定位。本发明中,通过依赖重定位寄存器重定位全局变量的第一可执行程序进行处理,得到不依赖重定位寄存器重定位全局变量的第二可执行程序,并基于第二可执行程序实现各个全局变量的重定位,消除了重定位寄存器影响第二可执行程序对多个全局变量的重定位,从而实现了多个全局变量的动态加载需求。
66.参照图2,图2为本发明全局变量的重定位方法第二实施例,基于第一实施例,步骤s20包括:
67.步骤s21,生成第一可执行程序对应的反汇编文件。
68.在本实施例中,装置会生成第一可执行程序的反汇编文件,也即装置把第一可执行程序的代码转换为汇编代码得到反汇编文件。反汇编文件中的汇编代码容易被装置识别,也即便于装置能够在第一可执行程序中查找到依赖重定位装置的重定位的指令。
69.在生成反汇编文件时,需要进行如下处理:
70.1、使用armlink.exe进行连接时,使用
“‑
info totals-info sizes-ro-base 0-map-symbols-first dll_entry-rwpi-ropi

list”这样的连接参数进行连接,其中-first dll_entry是指定入口地址,指定入口地址根据实际情况进行修改,但“ro-base 0“和
“‑
rwpi-ropi”连接参数是必须的,其中
“‑
rwpi-ropi”使生成的指令具有位置无关特性。
71.2、使用fromelf.exe生成可执行bin时,需要使用
“‑
bin”参数生成;
72.3、使用fromelf.exe生成该bin对应的汇编文件,使用"-c"参数生成。
73.步骤s22,扫描反汇编文件确定第一可执行程序中的各个第一指令,第一指令是重定位寄存器的重定位指令。
74.装置遍历反汇编文件即可确定第一可执行程序中的各个第一指令,第一指令是重定位寄存器的重定位指令。
75.步骤s23,将各个第一指令替换为第二指令得到第二可执行程序,第二指令是无效指令。
76.装置在第一可执行程序中将各个第一指令替换为第二指令即可得到第二可执行程序,第二指令是无效指令。例如,第二指令可以是为“mov r0,r0”指令,第二指令对应的机器码为“1c00”,也就是将第一可执行程序中第一指令对应位置的机器码替换为“1c00”。
77.在本实施例提供的技术方案中,装置生成第一可执行程序的反汇编文件,并扫描遍历反汇编文件得到第一可执行程序中的用于重定位寄存器重定位的第一指令,再将各个第一指令替换为无效的第二指令,从而得到不依赖重定位寄存器重定位的第二可执行程序。
78.参照图3,图3是本发明全局变量的重定位方法第三实施例,基于第二实施例,步骤s30包括:
79.步骤s31,根据反汇编文件获取每个第一指令对应的第一寄存器。
80.在本实施例中,第一可执行程序是使用r9寄存器(重定位寄存器)进行全局变量的重定位的,通过对反汇编文件的分析,第一可执行程序使用r9重寄存器进行重定位具有如下规律:
81.a)、所有全局变量的偏移地址都存在某个数据区域,该数据区域的地址可以通过汇编代码找到,比如,第一指令的字符“0xd9c”就是存放全部变量偏移地址的数据区域,该偏移地址是相对ro地址的偏移,由于连接是使用了“ro-base 0”,所以ro的首地址是“0”;
82.b)、访问全局变量时,首先使用ldr特征指令(ldr特征指令用于从存储器中将一个32位的字数据传送到目的寄存器中),取出全局变量的偏移地址,将该地址放入某个寄存器中,假设该寄存是r1寄存器;
83.c)、使用add特征指令(加法指令),将r9寄存器的值加到r1寄存器中,得到全局变量重定位后的地址,通过该地址访问全局变量;
84.d)、使用add特征指令将r9寄存器的内容加到另一个寄存器(比如r1寄存器)的指令是全局变量的重定位指令,该指令前面最近的一条使用ldr特征指令将某个地址内容装入该寄存器(r1寄存器)的指令一定全局变量偏移地址装入指令。
85.基于上述规律,即可在反汇编文件中查找到各个全局变量的相对地址。具体的,装置基于反汇编文件获取每个第一指令对应的第一寄存器,第一指令即为上述的“add”特征指令,第一寄存器例如为“r1”寄存器。装置查找所有对r9寄存器进行访问的第一指令对应的指令位置,同时找到该指令中的第一寄存器:比如第一指令类似“add r1 r9”,则第一寄存器即为r1寄存器。
86.步骤s32,在反汇编文件中确定每个第一指令对应的目标指令,其中,第一指令对应的目标指令是向第一指令对应的第一寄存器赋值的指令。
87.装置需要在反汇编文件中确定每个第一指令对应的目标指令。使用add指令(第一指令)将r9寄存器的内容加到另一个寄存器(比如r1寄存器)的指令(目标指令)是全局变量的重定位指令,add指令前面最近的一条使用“ldr”(目标指令)将某个地址内容装入该寄存器(r1寄存器)的指令一定全局变量偏移地址装入指令。可以理解的是,目标指令是向第一寄存器赋值的指令,且目标指令是从某个内存地址取出全局变量的相对地址到第一寄存器的指令。装置可以从第一指令的位置开始,往回查找与第一指令时间最近的目标指令。
88.步骤s33,根据每个目标指令获取各个全局变量的相对地址。
89.在找到目标指令后,装置即可在第一寄存器中找到目标指令所对应的全局变量的相对地址,也即装置可以得到每个全局变量的相对地址。
90.在本实施例提供的技术方案中,装置根据反汇编文件获取每个第一指令对应的第一寄存器,并在反汇编文件中确定每个第一指令对应的目标指令,从而根据每个目标指令获取各个全部变量的相对地址。
91.参照图4,图4是本发明全局变量的重定位方法第四实施例,基于第二或第三实施例,步骤s30包括:
92.步骤s34,将各个相对地址添加至第二可执行程序的头部位置得到第三可执行程序。
93.在本实施例中,装置在得到各个相对地址后,将各个相对地址添加至第二可执行
程序的头部得到第三可执行程序。
94.步骤s35,获取第二可执行程序中已初始化变量的首地址,并加载第三可执行程序得到首地址的第一加载地址。
95.装置获取第二可执行程序中已初始换变量rw的首地址,并加载第三可执行程序,从而可以得到首地址的第一加载地址。
96.将各个相对地址添加至可执行程序的头部位置,使得装置在确定实际加载地址时,不需要重新遍历反汇编文件得到全局变量的相对地址得到全局变量的实际加载地址,缩短了实际加载地址的计算时间。
97.进一步的,全局变量被多次访问时,全局变量具有多个相同的相对地址,故而,装置需要在各个相对地址中去掉重复的相对地址,再将去除重复相对地址的各个相对地址添加至第二可执行程序的头部位置得到第三可执行程序。
98.此外,装置将各个相对地址添加至第二可执行程序的头部位置后,再在添加相对位置的第二可执行程序的尾部位置添加预设字符,得到第三可执行程序。预设字符可以是0,从而可以降低内存越界的影响。可在尾部位置填充多个预设字符,也即可比实际zi(zi位于可执行程序的尾部)多填充几个0。
99.参照图5,第一可执行程序包括两部分,分别为ro setion(ro段)以及rw setion(rw段),在对第一可执行程序进行处理得到的第三可执行程序包括6部分,分为全局变量个数count、全局变量的相对地址存储区、ro size、ro setion(ro段)、rw setion(rw段)、zi setion(zi段,zi为程序中的未初始化的变量),其中,count占用四个字节,每个全局变量的相对地址占4个字节、ro size占四个字节、ro setion(ro段)中的第一指令被第二指令替换了。需要说明的是,全局变量的相对地址是相对r0首地址的偏移值,ro首地址编译时一遍设置为0。
100.在本实施例提供的技术方案中,装置将各个相对地址添加至第二可执行程序的头部位置得到第三可执行程序,获取第二可执行程序已初始化变量的首地址,并加载第三可执行程序即可得到首地址的第一加载地址。
101.本发明还提供一种全局变量的重定位设备,参照图6,全局变量的重定位设备600包括:
102.获取模块601,用于获取第一可执行程序,第一可执行程序对全局变量的访问依赖重定位寄存器的重定位;
103.处理模块602,用于对第一可执行程序进行处理得到第二可执行程序,第二可执行程序对全局变量的访问不依赖重定位寄存器的重定位;
104.确定模块603,用于确定第一可执行程序中各个全局变量的相对地址,并根据第二可执行程序获取第二可执行程序中已初始化变量的首地址的第一加载地址;
105.确定模块603,用于根据第一加载地址以及每个全局变量的相对地址,确定每个全局变量的实际加载地址,并将每个相对地址修改为每个相对地址对应的实际加载地址。
106.在一实施例中,全局变量的重定位设备600包括:
107.生成模块,用于生成第一可执行程序对应的反汇编文件;
108.扫描模块,用于扫描反汇编文件确定第一可执行程序中的各个第一指令,第一指令是重定位寄存器的重定位指令;
109.替换模块,用于将各个第一指令替换为第二指令得到第二可执行程序,第二指令是无效指令。
110.在一实施例中,全局变量的重定位设备600包括:
111.获取模块601,用于根据反汇编文件获取每个第一指令对应的第一寄存器;
112.确定模块603,用于在反汇编文件中确定每个第一指令对应的目标指令,其中,第一指令对应的目标指令是向第一指令对应的第一寄存器赋值的指令;
113.获取模块601,用于根据每个目标指令获取各个全局变量的相对地址。
114.在一实施例中,全局变量的重定位设备600包括:
115.添加模块,用于将各个相对地址添加至第二可执行程序的头部位置得到第三可执行程序;
116.获取模块601,用于获取第二可执行程序中已初始化变量的首地址,并加载第三可执行程序得到首地址的第一加载地址。
117.在一实施例中,全局变量的重定位设备600包括:
118.删除模块,用于在各个相对地址中去除重复的相对地址;
119.添加模块,用于将去除重复相对地址的各个相对地址,添加至第二可执行程序的头部位置,得到第三可执行程序。
120.在一实施例中,全局变量的重定位设备600包括:
121.添加模块,用于将各个相对地址添加至第二可执行程序的头部位置,并在添加相对地址的第二可执行程序的尾部位置添加预设字符,得到第三可执行程序。
122.在一实施例中,全局变量的重定位设备600包括:
123.编译模块,用于编译初始可执行程序;
124.设置模块,用于将初始可执行程序与重定位寄存器进行连接,并在将初始可执行程序与重定位寄存器的编译选项设置为位置无关,得到第一可执行程序。
125.图7是根据一示例性实施例示出的一种全局变量的重定位装置的硬件结构图。
126.全局变量的重定位装置700可以包括:处理器71,例如cpu,存储器72以及收发器73。本领域技术人员可以理解,图7中示出的结构并不构成对全局变量的重定位装置的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。存储器72可以由任何类型的易失性或非易失性存储设备或者它们的组合实现,如静态随机存取存储器(sram),电可擦除可编程只读存储器(eeprom),可擦除可编程只读存储器(eprom),可编程只读存储器(prom),只读存储器(rom),磁存储器,快闪存储器,磁盘或光盘。
127.处理器71可以调用存储器72内存储的计算机程序,以完成上述的全局变量的重定位方法的全部或部分步骤。
128.收发器73用于接收外部设备发送的信息以及向外部设备发送信息。
129.一种非临时性计算机可读存储介质,当该存储介质中的指令由全局变量的重定位装置的处理器执行时,使得全局变量的重定位装置能够执行上述全局变量的重定位方法。
130.一种计算机程序产品,包括计算机程序,当该计算机程序由全局变量的重定位装置的处理器执行时,使得全局变量的重定位装置能够执行上述全局变量的重定位方法。
131.本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本公开的其它实施方案。本发明旨在涵盖本公开的任何变型、用途或者适应性变化,这些变型、用途或
者适应性变化遵循本公开的一般性原理并包括本公开未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本公开的真正范围和精神由下面的权利要求书指出。
132.应当理解的是,本公开并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本公开的范围仅由所附的权利要求书来限制。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献