动态打补丁的方法和装置的制作方法

文档序号:6370387阅读:186来源:国知局

专利名称::动态打补丁的方法和装置的制作方法
技术领域
:本发明涉及一种动态打补丁的方法和装置。
背景技术
:通常,对补丁目标代码打补丁的方案是先离线将补丁代码编译并链接为以绝对地址开始的补丁镜像文件、随后生成补丁目标代码所包含的函数与补丁镜像文件所包含的补丁函数的相对应的替换关系;再将补丁镜像文件加载到设备后,根据替换关系将补丁目标代码包含的函数的入口指令修改为一条跳转指令跳转到补丁代码的补丁函数入口,执行补丁代码,从而完成对补丁目标代码打补丁。
发明内容本发明涉及一种动态打补丁的方法,其包括将包含补丁代码的可重定位的补丁镜像文件动态加载到待打补丁的目标代码所处的当前系统;通过重定位和链接所述补丁镜像文件将所述补丁代码初始化;将所述目标代码的执行跳转到所述补丁代码的执行。此外,本发明还涉及ー种动态打补丁的装置,其包括包括加载单元,用于将包含补丁代码的可重定位的补丁镜像文件动态加载到待打补丁的目标代码所处的当前系统;重定位和链接单元,用于通过重定位和链接所述补丁镜像文件将所述补丁代码初始化;跳转单元,用于将所述目标代码的执行跳转到所述补丁代码的执行。本发明提供的技术方案,在离线阶段事先将补丁制作为可重定位的镜像文件,比如标准的可执行的链接格式(ExecutableandLinkingFormat,简称ELF)目标文件,而不是制作为绝对定位的文件;可以在设备中激活补丁时,根据动态分配到的空间地址和镜像文件中的符号表信息,对补丁中的符号段中的函数和全局变量的符号重新赋值、代码段重定位。不需要为补丁镜像文件预先划分好空间,因此补丁镜像文件的伸縮性好。此外,本发明实施例提供的方法和装置支持对动态加载模块的函数打补丁。同时,借助本发明实施例提供的方法和装置能够实现ー个补丁镜像文件适配多个版本镜像。另外,借助本发明实施例提供的方法和装置还能够实现对补丁镜像文件进ー步打补丁。下面借助实施例结合以下附图进ー步阐述本发明。其中图I示出了本发明实施例提供的一种动态打补丁的方法的示例性流程图;图2示出了本发明实施例提供的另ー种动态打补丁的方法的示例性流程图;图3示出了本发明实施例提供的另ー种动态打补丁的方法的示例性流程图;图4示出了本发明实施例提供的另ー种动态打补丁的方法的示例性流程图;图5示出了本发明的ー个具体实施例的动态打补丁的方法的示例性流程图;图6示出了本发明实施例提供的一种动态打补丁的装置的示意性框图。具体实施例方式在下文中将结合附图对本发明的示范性实施例进行描述。为了清楚和简明起见,在说明书中并未描述实际实施方式的所有特征。然而,应该了解,在开发任何这种实际实施方式的过程中可以做出很多特定于实施方式的决定,以便实现开发人员的具体目标,并且这些决定可能会随着实施方式的不同而有所改变。在此,还需要说明的一点是,为了避免因不必要的细节而模糊了本发明,在附图中仅仅示出了与根据本发明的方案密切相关的装置结构,而省略了与本发明关系不大的其他细节。在描述本发明实施例提供的动态打补丁的方式时会涉及如下术语当前系统、目标代码、补丁代码和补丁镜像文件。在本文中,当前系统可以理解为目标代码和补丁代码等所运行的硬件设备诸如通信系统的硬件设备、个人计算机、个人数字设备等等,或也可以理解为软件环境,诸如计算机操作系统、专用操作系统等等。出于描述的便利的原因,本文中使用的术语“目标代码”理解为待打补丁的程序或代码,而术语“补丁代码”理解为用于打补丁的程序或代码。术语“补丁镜像文件”理解为基于一定的格式将补丁代码编译后的生成的文件。在图I中示出了本发明实施例提供的一种动态打补丁的方法的示例性流程图。所述方法包括110,本发明实施例提供的一种动态打补丁的方法开始运行。120,将包含补丁代码的可重定位的补丁镜像文件动态加载到待打补丁的目标代码所处的当前系统。在此需要说明的是,可重定位的补丁镜像文件理解为对补丁代码预处理之后生成的镜像文件,其中该预处理在本
技术领域
中通常也理解为离线处理,即当前系统外的处理。在此,预处理可以包括对代码进行编译和链接等等。编译就是通常所言的利用编译程序从源语言编写的源程序产生目标程序的过程,而链接是指在电子计算机程序的各模块之间传递參数和控制命令,并把它们组成一个可执行的整体的过程。通常,补丁镜像文件包括ネト丁初始化入口函数、补丁函数、文本段、字符段、数据段、重定位段等等,在此并不逐一列举而是仅仅谈及该方法所涉及的相关内容。在此,补丁镜像文件可以是可执行的链接格式(ELF)目标文件,并且以各种编程语言以函数为单位来编辑。130,通过重定位和链接所述补丁镜像文件将所述补丁代码初始化。对于本领域技术人员而言,重定位理解为,将程序或代码的逻辑地址空间变换成当前系统的内存中的实际物理地址空间的过程。重定位包括动态重定位和静态重定位。在本发明实施例中尤其是涉及动态重定位。也就是说,在补丁镜像文件装入当前系统之后,只有在当前系统调用补丁镜像文件时才动态地将逻辑地址(也称为相对地址)转换为物理地址(也称为绝对地址)。链接则是指从一个对象指向另ー个对象的连接关系。在此对象可以理解为例如补丁镜像文件、补丁代码和目标代码等等中的各种函数、符号和全局变量等等。重定位和链接所述补丁镜像文件就是针对补丁镜像文件进行配置,使之与当前系统建立连接关系(也称为映射关系),从而完成所述补丁代码的初始化。140,将所述目标代码的执行跳转到所述补丁代码的执行。在当前系统调用目标代码时,当前系统根据130中建立的连接关系调用补丁代码并且执行,从而目标代码的执行被通过补丁代码的执行而取代。由此,实现了动态打补丁的过程。在本发明实施例提供的动态打补丁的过程可以与补丁镜像文件所加载的当前系统的硬件配置和软件配置无关地运行。该过程也无需手工配置补丁镜像文件。通过将补丁镜像文件动态加载到当前系统,能够支持补丁镜向文件加载到任意动态分配的空间。通过动态加载使补丁代码所需的空间根据需要来进行分配,而不需要为补丁镜像文件预先划分好空间,从而可以实现空间的任意伸縮。通过补丁镜像文件动态加载到当前系统,使补丁镜像文件与当前系统的硬件环境和软件环境无关,因此本发明实施例提供的方法能够支持对动态加载模块的函数打补丁。图2示出了本发明实施例提供的另ー种动态打补丁的方法的示例性流程图。如图2所示,根据本实施例的动态打补丁的方法在210开始。220,将包含补丁代码的可重定位的补丁镜像文件动态加载到待打补丁的目标代码所处的当前系统。220可以參考图I所示的120来执行。如图2所示,所述220,将包含补丁代码的可重定位的补丁镜像文件动态加载到待打补丁的目标代码所处的当前系统具体可以包括221,在所述当前系统中,为所述补丁镜像文件中的文本段和数据段分配运行空间,并且将所述文本段和数据段的内容拷贝到所述运行空间;222,为所述补丁镜像文件中的符号段分配符号空间,并且将所述符号段的内容拷贝到所述符号空间。在此需要说明的是,在此对221和222的编号并不含有步骤执行顺序方面的含义。230,通过重定位和链接所述补丁镜像文件将所述补丁代码初始化。230可以參考图I所示的130来执行。240,将所述目标代码的执行跳转到所述补丁代码的执行。240可以參考图I所示的140来执行。在此实施例中,所述补丁镜像文件中包含的在所述目标代码中不存在的函数的地址等于所述函数的地址加上所述函数在符号段的实际加载地址;所述补丁镜像文件中包含的在所述目标代码中不存在的全局变量的地址等于所述全局变量的地址加上所述全局变量在符号段的实际加载地址。而对于补丁镜像文件中未涉及的函数、全局变量,函数、全局变量的符号,以在当前系统的符号表中函数、全局变量,函数、全局变量的所述符号的地址赋值给所述未涉及的函数、全局变量,函数、全局变量的符号。可选地,如图3所示,所述通过重定位和链接所述补丁镜像文件将所述补丁代码初始化具体包括331,以所述运行空间的地址作为起始绝对地址,对所述符号段中的函数和全局变量的符号赋值;332,通过所述补丁镜像文件的重定位段中包含的指令对所述补丁代码进行重定位;333,调用特定的补丁初始化入口函数来初始化所述补丁代码。此外可选地,如图4所示,所述通过所述补丁镜像文件的重定位段中包含的指令对所述补丁代码进行重定位具体包括4321,修改所述目标代码的函数入口指令以跳转到所述补丁代码的补丁函数;4322,将所述补丁镜像文件中包含的在所述目标代码中不存在的函数和全局变量的信息添加到当前系统中。图5示出了根据本发明的动态打补丁的方法的ー个具体实施例的示例性流程图。在该方法中包括501,本发明实施例提供的一种动态打补丁的方法开始运行;502,在当前系统中,为包含补丁代码的可重定位的补丁镜像文件中的文本段和数据段分配运行空间,并且将所述文本段和数据段的内容拷贝到所述运行空间;503,为所述补丁镜像文件中的符号段分配符号空间,并且将所述符号段的内容拷贝到所述符号空间;504,以所述运行空间的地址作为起始绝对地址,对所述符号段的函数和全局变量的符号赋值;505,修改所述目标代码的函数入口指令以跳转到所述补丁代码的补丁函数;506,将所述补丁镜像文件中包含的在所述目标代码中不存在的的函数和全局变量的信息添加到当前系统中;507,调用特定的补丁初始化入口函数;508,将所述目标代码的执行跳转到所述补丁代码的执行。在此需要指出的是,本具体实施例不应该理解为限制性,而仅仅是为了对本发明的理解更为清楚和准确示例性地示出了本发明实施例的动态打补丁的方法的流程图。该具体实施例中所涉及的术语及其相关含义与根据图I至图4所阐述的动态打补丁的方法中涉及的术语及其相关含义相同,在此出于清楚的原因而不再赘述。本发明的该具体实施例提供的动态打补丁的过程可以与补丁镜像文件所加载的当前系统的硬件配置和软件配置无关地运行。从而,该过程也无需手工配置补丁镜像文件。由于补丁镜像文件被动态加载到当前系统,所以本发明的该具体实施例提供的动态打补丁的方法能够支持补丁镜向文件加载到任意动态分配的空间。由此,实现了补丁代码所需的空间根据需要进行分配,从而不需为补丁镜像文件预先划分好空间,并且因此可以实现空间的任意伸縮。通过补丁镜像文件动态加载到当前系统,使补丁镜像文件与当前系统的硬件环境和软件环境无关,因此本发明的该具体实施例提供的动态打补丁的方法能够支持对动态加载模块的函数打补丁。在下文中,将结合图6并且參照根据本发明实施例提供的动态打补丁的方法来阐述根据本发明提供的动态打补丁的装置。图6示出了本发明实施例提供的一种动态打补丁的装置的示意性框图,用于实现本发明图I所提供的动态打补丁方法。如图6所示,该动态打补丁的装置600包括加载单元610,用于将包含补丁代码的可重定位的补丁镜像文件动态加载到待打补丁的目标代码所处的当前系统;重定位和链接单元620,用于通过重定位和链接所述补丁镜像文件将所述补丁代码初始化;跳转单元630,用于将所述目标代码的执行跳转到所述补丁代码的执行。所述加载单元610具体可用于在所述当前系统中,为所述补丁镜像文件中的文本段和数据段分配运行空间,并且将所述文本段和数据段的内容拷贝到所述运行空间;为所述补丁镜像文件中的符号段分配符号空间,并且将所述符号段的内容拷贝到所述符号空间。所述重定位和链接单元620具体可用于以所述运行空间的地址作为起始绝对地址,对所述符号段的函数和全局变量的符号赋值;通过所述补丁镜像文件的重定位段中包含的指令对所述补丁代码进行重定位;调用特定的补丁初始化入口函数来初始化所述补丁代码。所述补丁镜像文件中包含的在所述目标代码中不存在的函数的地址等于所述函数的地址加上所述函数在符号段的实际加载地址;所述补丁镜像文件中包含的在所述目标代码中不存在的全局变量的地址等于所述全局变量的地址加上所述全局变量在符号段的实际加载地址。对于补丁镜像文件中未涉及的函数和全局变量的符号,以在当前系统的符号表中函数和全局变量的所述符号的地址赋值给所述未涉及的函数和全局变量的符号。具体而言,根据本发明的实施例的动态打补丁的方法中相关术语同样也适用于根据本发明的实施例的动态打补丁的装置。所述重定位和链接单元620在通过所述补丁镜像文件的重定位段中包含的指令对所述补丁代码进行重定位时,具体用于修改所述目标代码的函数入口指令以跳转到所述补丁代码的补丁函数;将所述补丁镜像文件中包含的在所述目标代码中不存在的函数和全局变量的信息添加到当前系统中。在针对上述本发明实施例的动态打补丁的方法所阐述的技术优点和技术效果同样也适用于本发明实施例的动态打补丁的装置,因此在此不再赘述。本领域技术人员应该理解,本发明实施例中装置模块的划分为功能划分,实际具体结构可以为上述功能模块的拆分或合井。本领域普通技术人员可以理解实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于ー计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括R0M、RAM、磁碟或者光盘等各种可以存储程序代码的介质。以上所述仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。权利要求的内容记载的方案也是本发明实施例的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。权利要求1.一种动态打补丁的方法,其特在在于,包括将包含补丁代码的可重定位的补丁镜像文件动态加载到待打补丁的目标代码所处的当前系统;通过重定位和链接所述补丁镜像文件将所述补丁代码初始化;将所述目标代码的执行跳转到所述补丁代码的执行。2.根据权利要求I所述的动态打补丁的方法,其特征在于,所述将包含补丁代码的可重定位的补丁镜像文件动态加载到待打补丁的目标代码所处的当前系统,具体包括在所述当如系统中,为所述补丁镜像文件中的文本段和数据段分配运行空间,并且将所述文本段和数据段的内容拷贝到所述运行空间;为所述补丁镜像文件中的符号段分配符号空间,并且将所述符号段的内容拷贝到所述符号空间。3.根据权利要求I或2所述的动态打补丁的方法,其特征在于,所述通过重定位和链接所述补丁镜像文件将所述补丁代码初始化,具体包括以所述运行空间的地址作为起始绝对地址,对所述符号段中的函数和全局变量的符号赋值;通过所述补丁镜像文件的重定位段中包含的指令对所述补丁代码进行重定位;调用特定的补丁初始化入ロ函数来初始化所述补丁代码。4.根据权利要求3所述的动态打补丁的方法,其特征在干,所述补丁镜像文件中包含的在所述目标代码中不存在的函数的地址等于所述函数的地址加上所述函数在符号段的实际加载地址;所述补丁镜像文件中包含的在所述目标代码中不存在的全局变量的地址等于所述全局变量的地址加上所述全局变量在符号段的实际加载地址。5.根据权利要求3或4所述的动态打补丁的方法,其特征在于,所述通过所述补丁镜像文件的重定位段中包含的指令对所述补丁代码进行重定位,具体包括修改所述目标代码的函数入口指令以跳转到所述补丁代码的补丁函数;将所述补丁镜像文件中包含的在所述目标代码中不存在的函数和全局变量的信息添加到当前系统中。6.一种动态打补丁的装置,其特征在于,包括加载单元,用于将包含补丁代码的可重定位的补丁镜像文件动态加载到待打补丁的目标代码所处的当前系统;重定位和链接单元,用于通过重定位和链接所述补丁镜像文件将所述补丁代码初始化;跳转单元,用于将所述目标代码的执行跳转到所述补丁代码的执行。7.根据权利要求6所述的动态打补丁的装置,其特征在于,所述加载単元具体用于在所述当如系统中,为所述补丁镜像文件中的文本段和数据段分配运行空间,并且将所述文本段和数据段的内容拷贝到所述运行空间;为所述补丁镜像文件中的符号段分配符号空间,并且将所述符号段的内容拷贝到所述符号空间。8.根据权利要求6或7所述的动态打补丁的装置,其特征在于,所述重定位和链接单元具体用于以所述运行空间的地址作为起始绝对地址,对所述符号段的函数和全局变量的符号赋值;通过所述补丁镜像文件的重定位段中包含的指令对所述补丁代码进行重定位;调用特定的补丁初始化入ロ函数来初始化所述补丁代码。9.根据权利要求8所述的动态打补丁的装置,其特征在于,所述重定位和链接单元在通过所述补丁镜像文件的重定位段中包含的指令对所述补丁代码进行重定位时,具体用于修改所述目标代码的函数入口指令以跳转到所述补丁代码的补丁函数;将所述补丁镜像文件中包含的在所述目标代码中不存在的函数和全局变量的信息添加到当前系统中。全文摘要本发明的实施例公开了动态打补丁的方法和装置。该动态打补丁的方法包括将包含补丁代码的可重定位的补丁镜像文件动态加载到待打补丁的目标代码所处的当前系统;通过重定位和链接所述补丁镜像文件将所述补丁代码初始化;将所述目标代码的执行跳转到所述补丁代码的执行。文档编号G06F9/445GK102722387SQ201210170368公开日2012年10月10日申请日期2012年5月29日优先权日2012年5月29日发明者丁厚永申请人:华为技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1