发明内容
因此,本申请实施例提供一种动态库处理方法和装置、电子设备及存储介质,能够减少内存空间消耗。
第一方面,本申请实施例提供了一种动态库处理方法,包括:
在init进程启动后,将目标动态库加载到第一虚拟地址空间,并将所述目标动态库中的目标数据保存到目标文件中,其中,所述目标数据包括利用堆栈地址随机化技术对所述目标动态库的可读写数据段中的全局偏移表进行处理得到的只读数据;
对所述目标文件进行内存映射,得到内存映射的信息,并将所述内存映射的信息存储到内存中,其中,所述内存映射的信息包括内存映射的起始地址和大小。
第二方面,本申请实施例还提供了一种动态库处理方法,包括:
在应用将目标动态库加载到第二虚拟地址空间后,判断内存中是否存储有内存映射的信息,其中,所述内存映射的信息包括内存映射的起始地址和大小;
若内存中存储有内存映射的信息,则通过内存映射将所述目标动态库中的目标数据映射到所述内存映射的信息对应的内存区域,其中,所述目标数据包括利用堆栈地址随机化技术对所述目标动态库的可读写数据段中的全局偏移表进行处理得到的只读数据。
第三方面,本申请实施例还提供了一种动态库处理装置,包括:
保存单元,用于在init进程启动后,将目标动态库加载到第一虚拟地址空间,并将所述目标动态库中的目标数据保存到目标文件中,其中,所述目标数据包括利用堆栈地址随机化技术对所述目标动态库的可读写数据段中的全局偏移表进行处理得到的只读数据;
第一内存映射单元,用于对所述目标文件进行内存映射,得到内存映射的信息,并将所述内存映射的信息存储到内存中,其中,所述内存映射的信息包括内存映射的起始地址和大小。
第四方面,本申请实施例还提供了一种动态库处理装置,包括:
判断单元,用于在应用将目标动态库加载到第二虚拟地址空间后,判断内存中是否存储有内存映射的信息,其中,所述内存映射的信息包括内存映射的起始地址和大小;
第二内存映射单元,用于若内存中存储有内存映射的信息,则通过内存映射将所述目标动态库中的目标数据映射到所述内存映射的信息对应的内存区域,其中,所述目标数据包括利用堆栈地址随机化技术对所述目标动态库的可读写数据段中的全局偏移表进行处理得到的只读数据。
第五方面,本申请实施例还提供了一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器运行时执行如第一方面或第二方面所述的动态库处理方法的步骤。
第六方面,本申请实施例还提供了一种电子设备,包括:处理器、存储介质和总线,所述存储介质存储有所述处理器可执行的机器可读指令,当电子设备运行时,所述处理器与所述存储介质之间通过总线通信,所述处理器执行所述机器可读指令,以执行如第一方面或第二方面所述的动态库处理方法的步骤。
综上,本申请实施例提供的动态库处理方法和装置、电子设备及存储介质,在应用加载动态库到虚拟地址空间后,通过将动态库中的目标数据内存映射到init进程对该目标数据做内存映射所使用的内存区域,使得多个使用同一动态库的应用只需占用同一块内存区域加载目标数据,因而能够减少内存空间消耗。
具体实施方式
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,应当理解,本申请中附图仅起到说明和描述的目的,并不用于限定本申请的保护范围。另外,应当理解,示意性的附图并未按实物比例绘制。本申请中使用的流程图示出了根据本申请的一些实施例实现的操作。应该理解,流程图的操作可以不按顺序实现,没有逻辑的上下文关系的步骤可以反转顺序或者同时实施。此外,本领域技术人员在本申请内容的指引下,可以向流程图添加一个或多个其他操作,也可以从流程图中移除一个或多个操作。
另外,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本申请实施例的组件可以以各种不同的配置来布置和设计。因此,以下对在附图中提供的本申请的实施例的详细描述并非旨在限制要求保护的本申请的范围,而是仅仅表示本申请的选定实施例。基于本申请的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本申请保护的范围。
需要说明的是,本申请实施例中将会用到术语“包括”,用于指出其后所声明的特征的存在,但并不排除增加其它的特征。
参照图1所示,为本申请实施例提供的一种动态库处理方法,包括:
S10、在init进程启动后,将目标动态库加载到第一虚拟地址空间,并将所述目标动态库中的目标数据保存到目标文件中,其中,所述目标数据包括利用堆栈地址随机化技术对所述目标动态库的可读写数据段中的全局偏移表进行处理得到的只读数据;
本实施例中,可以理解的是,init进程是用户态第一个进程,由init进程复制(fork)出其它进程。init进程启动后,会将目标动态库加载到其虚拟地址空间,该虚拟地址空间中目标动态库对应的地址范围为第一虚拟地址空间。之后init进程会将目标动态库中的目标数据保存(dump)到目标文件中。需要说明的是,目标动态库包括只读的程序段和可读写的数据段,本实施例中需要利用堆栈地址随机化(RELRO)技术将可读写的数据段中的全局偏移表(Global Offset Table,GOT)处理成只读的数据。
S11、对所述目标文件进行内存映射,得到内存映射的信息,并将所述内存映射的信息存储到内存中,其中,所述内存映射的信息包括内存映射的起始地址和大小。
本实施例中,需要对目标文件进行内存映射(mmap),并将内存映射的内存区域的起始地址和大小存储到内存中。因为其它进程最开始都是由init进程fork出来的,所以其它进程都可以继承访问到这些信息。需要说明的是,由于云应用平台服务器可以采用ARM架构,ARM架构又区分32位和64位,因此,步骤S10和S11在执行时可以针对32位的动态库和64位的动态库分别执行。
本申请实施例提供的动态库处理方法,通过保存init进程对动态库中的目标数据保存的目标文件进行内存映射的信息,使得应用能够获得该信息,继而在加载动态库到虚拟地址空间后,能够将动态库中的目标数据内存映射到该信息对应的内存区域,使得多个使用同一动态库的应用只需占用同一块内存区域加载目标数据,因而能够减少内存空间消耗。
在前述方法实施例的基础上,所述方法还可以包括:
将所述第一虚拟地址空间的基地址存储到内存中。
本实施例中,需要说明的是,为了使其它的进程可以使用目标数据,需要应用都在相同的虚拟地址空间加载目标动态库,因此需要保存第一虚拟地址空间的基地址到内存中,这样应用就可以基于该基地址加载目标动态库,继而将目标动态库中的目标数据内存映射到前述实施例中内存映射的信息对应的内存区域。
参照图2所示,为本申请实施例提供的一种动态库处理方法,包括:
S20、在应用将目标动态库加载到第二虚拟地址空间后,判断内存中是否存储有内存映射的信息,其中,所述内存映射的信息包括内存映射的起始地址和大小;
本实施例中,需要说明的是,应用启动后,会将目标动态库加载到虚拟地址空间,该虚拟地址空间中目标动态库对应的地址范围为第二虚拟地址空间,也就是说第一虚拟地址空间和第二虚拟地址空间的基地址和大小相同。之后应用会判断内存中是否存储有内存映射的信息,其中,内存映射的信息为init进程对目标数据保存的目标文件做内存映射得到的内存区域的信息。
S21、若内存中存储有内存映射的信息,则通过内存映射将所述目标动态库中的目标数据映射到所述内存映射的信息对应的内存区域,其中,所述目标数据包括利用堆栈地址随机化技术对所述目标动态库的可读写数据段中的全局偏移表进行处理得到的只读数据。
若内存中存储有内存映射的信息,则不再对目标数据分配内存,而是通过内存映射将所述目标动态库中的目标数据映射到所述内存映射的信息对应的内存区域,这样针对目标数据,多个应用只需使用一块内存区域,而不需要对各个应用分别分配一块内存区域,从而能够节省内存空间。需要说明的是,RELRO技术主要是为防攻击设计,因而虽然目标数据是只读的,但现有技术的逻辑实现时仍然会将目标数据加载到各个应用的内存中,但由于它们是只读形式存在的,是可以不用加载到各个应用的内存中去的。通过步骤S20和步骤S21的实现,即可使目标数据只占用一份内存。比如动态库A中的目标数据占用的内存空间为1M,100个应用要使用动态库A,按照现有技术,那么就需要分配100M的内存,而按照本实施例的逻辑处理后,只需要给这100个应用分配1M的内存,节省了99M的内存空间。
本申请实施例提供的动态库处理方法,在应用加载动态库到虚拟地址空间后,通过将动态库中的目标数据内存映射到init进程对该目标数据做内存映射所使用的内存区域,使得多个使用同一动态库的应用只需占用同一块内存区域加载目标数据,因而能够减少内存空间消耗。
在前述方法实施例的基础上,所述第二虚拟地址空间与init进程加载所述目标动态库使用的第一虚拟地址空间的基地址相同;
其中,在所述判断内存中是否存储有内存映射的信息之前,还可以包括:
应用从内存中获取第一虚拟地址空间的基地址,基于所述基地址将目标动态库加载到第二虚拟地址空间。
本实施例中,应用基于第一虚拟地址空间的基地址将目标动态库加载到第二虚拟地址空间,可以使所有的应用使用相同地址范围的虚拟地址空间加载目标动态库,继而实现将目标动态库中的目标数据内存映射到同一内存区域。
参照图3所示,为本申请实施例提供的一种动态库处理装置,包括:
保存单元30,用于在init进程启动后,将目标动态库加载到第一虚拟地址空间,并将所述目标动态库中的目标数据保存到目标文件中,其中,所述目标数据包括利用堆栈地址随机化技术对所述目标动态库的可读写数据段中的全局偏移表进行处理得到的只读数据;
第一内存映射单元31,用于对所述目标文件进行内存映射,得到内存映射的信息,并将所述内存映射的信息存储到内存中,其中,所述内存映射的信息包括内存映射的起始地址和大小。
本申请实施例提供的动态库处理装置,通过保存init进程对动态库中的目标数据保存的目标文件进行内存映射的信息,使得应用能够获得该信息,继而在加载动态库到虚拟地址空间后,能够将动态库中的目标数据内存映射到该信息对应的内存区域,使得多个使用同一动态库的应用只需占用同一块内存区域加载目标数据,因而能够减少内存空间消耗。
本申请实施例提供的动态库处理装置,其实现过程与本申请实施例提供的动态库处理方法一致,所能达到的效果也与本申请实施例提供的动态库处理方法相同,在此不再赘述。
参照图4所示,为本申请实施例提供的一种动态库处理装置,包括:
判断单元40,用于在应用将目标动态库加载到第二虚拟地址空间后,判断内存中是否存储有内存映射的信息,其中,所述内存映射的信息包括内存映射的起始地址和大小;
第二内存映射单元41,用于若内存中存储有内存映射的信息,则通过内存映射将所述目标动态库中的目标数据映射到所述内存映射的信息对应的内存区域,其中,所述目标数据包括利用堆栈地址随机化技术对所述目标动态库的可读写数据段中的全局偏移表进行处理得到的只读数据。
本申请实施例提供的动态库处理装置,在应用加载动态库到虚拟地址空间后,通过将动态库中的目标数据内存映射到init进程对该目标数据做内存映射所使用的内存区域,使得多个使用同一动态库的应用只需占用同一块内存区域加载目标数据,因而能够减少内存空间消耗。
本申请实施例提供的动态库处理装置,其实现过程与本申请实施例提供的动态库处理方法一致,所能达到的效果也与本申请实施例提供的动态库处理方法相同,在此不再赘述。
如图5所示,本申请实施例提供的一种电子设备,包括:处理器50、存储器51和总线52,所述存储器51存储有所述处理器50可执行的机器可读指令,当电子设备运行时,所述处理器50与所述存储器51之间通过总线52通信,所述处理器50执行所述机器可读指令,以执行如上述动态库处理方法的步骤。
具体地,上述存储器51和处理器50能够为通用的存储器和处理器,这里不做具体限定,当处理器50运行存储器51存储的计算机程序时,能够执行上述动态库处理方法。
对应于上述动态库处理方法,本申请实施例还提供了一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器运行时执行上述动态库处理方法的步骤。
以上仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应以权利要求的保护范围为准。