CN105630557A - 热补丁方法和装置 - Google Patents
热补丁方法和装置 Download PDFInfo
- Publication number
- CN105630557A CN105630557A CN201510996032.6A CN201510996032A CN105630557A CN 105630557 A CN105630557 A CN 105630557A CN 201510996032 A CN201510996032 A CN 201510996032A CN 105630557 A CN105630557 A CN 105630557A
- Authority
- CN
- China
- Prior art keywords
- patch
- function
- patch function
- dynamic link
- symbol
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/60—Software deployment
- G06F8/65—Updates
- G06F8/656—Updates while running
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种热补丁方法和装置,涉及嵌入式操作系统领域,用于解决传统热补丁方法需要重定位、分配内存不灵活和无法实现一个补丁文件对应多个应用程序的问题。热补丁方法包括:在对被补丁程序进行编译时增加动态链接编译选项,使被补丁函数的外部符号添加到动态符号表,以使编译后的外部符号能够被动态链接库重定位,其中被补丁程序包含被补丁函数和外部符号;通过动态链接库方式编译补丁函数,以使编译后的补丁函数能够重定位外部符号,其中,补丁函数为对被补丁函数进行修补的函数;加载补丁函数并且重定位外部符号;激活补丁函数并且去激活被补丁函数。本发明的实施例用于热补丁重定位。
Description
技术领域
本发明涉及嵌入式操作系统领域,尤其涉及一种热补丁方法和装置。
背景技术
对于采用嵌入式Linux操作系统的设备来说,需要高可靠性和稳定性,但是在其上运行的软件程序不可避免存在各种错误,为了解决软件程序中的错误,一种方式是进行系统软件升级,但是会导致设备重启影响当前业务,另一种方式是采用热补丁,其优点是不必重启设备不会影响当前业务。但是传统的热补丁方法存在以下问题:
传统的热补丁方法,热补丁文件为没有经过编译链接的静态目标文件,在使用时还需要对其中的外部符号进行重定位,而整个重定位过程非常复杂。
传统的热补丁方法,需要预留一定内存空间用作补丁内存区,如果补丁加载后占用内存空间大于补丁内存区则会由于内存不够而不能加载,因此分配内存空间缺少灵活性。
对于多核多CPU(英文名称:centralprocessingunit,中文名称:中央处理器)的应用,特别是分布式系统中,运行着多个应用程序,这些应用程序相同但运行在不同CPU上或者不同但有相同的缺陷函数,由于重定位后不同的应用程序里的符号地址不同,所以传输的热补丁方法需要对每个应用程序都做一个补丁文件,因此无法实现一个补丁文件对应多个应用程序。
发明内容
本发明的实施例提供一种热补丁方法和装置,用于解决传统热补丁方法需要重定位、分配内存不灵活和无法实现一个补丁文件对应多个应用程序的问题。
为达到上述目的,本发明的实施例采用如下技术方案:
一方面,提供了一种热补丁方法,包括:
在对被补丁程序进行编译时增加动态链接编译选项,使被补丁函数的外部符号添加到动态符号表,以使编译后的所述外部符号能够被动态链接库重定位,其中所述被补丁程序包含所述被补丁函数和所述外部符号;
通过动态链接库方式编译补丁函数,以使编译后的补丁函数能够重定位所述外部符号,其中,所述补丁函数为对所述被补丁函数进行修补的函数;
加载所述补丁函数并且重定位所述外部符号;
激活所述补丁函数并且去激活所述被补丁函数。
结合第一方面,在第一种可能的实施方式中,所述通过动态链接库方式编译补丁函数,包括:
配置补丁函数替换表,结合所述补丁函数生成补丁目标源文件,其中,所述补丁函数替换表包含所述补丁函数与所述被补丁函数的对应关系;
对所述补丁目标源文件进行编译以生成动态链接库格式的补丁文件。
结合第一方面的第一种可能的实施方式,在第二种可能的实施方式中,所述激活所述补丁函数并且去激活所述被补丁函数,包括:
根据所述补丁函数替换表获取所述被补丁函数和所述补丁函数的地址;
根据所述被补丁函数的地址将所述被补丁函数入口处的指令替换为跳转指令,其中,所述跳转指令指示跳转至所述补丁函数的地址;
根据所述跳转指令跳转至所述补丁函数,不执行所述被补丁函数而执行所述补丁函数。
结合第一方面,在第三种可能的实施方式中,所述激活所述补丁函数,包括:
临时激活所述补丁函数,使所述补丁函数临时生效,以使系统重启后所述补丁函数不生效。
结合第一方面,在第四种可能的实施方式中,所述激活所述补丁函数,包括:
永久激活所述补丁函数,使所述补丁函数正式生效,以使系统重启后所述补丁函数仍然生效。
第二方面,提供了一种热补丁装置,包括:
编译单元,用于在对被补丁程序进行编译时增加动态链接编译选项,使被补丁函数的外部符号添加到动态符号表,以使编译后的所述外部符号能够被动态链接库重定位,其中所述被补丁程序包含所述被补丁函数和所述外部符号;
制作单元,用于通过动态链接库方式编译补丁函数,以使编译后的补丁函数能够重定位所述外部符号,其中,所述补丁函数为对所述被补丁函数进行修补的函数;
加载单元,用于加载所述补丁函数并且重定位所述外部符号;
所述加载单元,还用于激活所述补丁函数并且去激活所述被补丁函数。
结合第二方面,在第一种可能的实施方式中,
所述制作单元,具体用于配置补丁函数替换表,结合所述补丁函数生成补丁目标源文件,其中,所述补丁函数替换表包含所述补丁函数与所述被补丁函数的对应关系;对所述补丁目标源文件进行编译以生成动态链接库格式的补丁文件。
结合第二方面的第一种可能的实施方式,在第二种可能的实施方式中,
所述加载单元,具体用于根据所述补丁函数替换表获取所述被补丁函数和所述补丁函数的地址;根据所述被补丁函数的地址将所述被补丁函数入口处的指令替换为跳转指令,其中,所述跳转指令指示跳转至所述补丁函数的地址;根据所述跳转指令跳转至所述补丁函数,不执行所述被补丁函数而执行所述补丁函数。
结合第二方面,在第三种可能的实施方式中,
所述加载单元,具体用于临时激活所述补丁函数,使所述补丁函数临时生效,以使系统重启后所述补丁函数不生效。
结合第二方面,在第四种可能的实施方式中,
所述加载单元,具体用于永久激活所述补丁函数,使所述补丁函数正式生效,以使系统重启后所述补丁函数仍然生效。
本发明的实施例提供的热补丁方法和装置,在对被补丁程序进行编译时增加动态链接编译选项,使被补丁函数的外部符号添加到动态符号表,以使编译后的外部符号能够被动态链接库重定位,其中被补丁程序包含被补丁函数和外部符号;通过动态链接库方式编译补丁函数,以使编译后的补丁函数能够重定位外部符号,其中,补丁函数为对被补丁函数进行修补的函数;加载补丁函数并且重定位外部符号;激活补丁函数并且去激活被补丁函数。本发明的实施例通过将被补丁程序中的被补丁函数的外部符号添加到动态符号表并且将补丁函数编译为动态链接库,利用操作系统中的动态链接库加载函数自动对补丁函数所涉及的外部符号进行重定位,利用操作系统对动态链接库的加载、删除自动分配内存的特性来灵活分配内存,同时利用动态链接库中一份动态链接库代码可以被多处使用的优势来使一个补丁文件对应多个应用程序,解决了传统热补丁方法需要重定位、分配内存不灵活和无法实现一个补丁文件对应多个应用程序的问题。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明的实施例提供的一种热补丁方法的流程示意图;
图2为本发明的实施例提供的另一种热补丁方法的流程示意图;
图3为本发明的实施例提供的热补丁激活过程的流程示意图;
图4为本发明的实施例提供的激活补丁函数去激活被补丁函数过程的示意图;
图5为本发明的实施例提供的一种热补丁装置的结构示意图;
图6为本发明的实施例提供的制作单元的结构示意图;
图7为本发明的实施例提供的加载单元的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明的实施例提供的热补丁方法,可以由热补丁装置执行,热补丁装置包括制作单元以及加载单元两部分,其中加载单元可以集成在嵌入式Linux系统的通信设备中,通信设备包括例如交换机、路由器等。本发明的实施例所应用的通信设备包括一个或多个CPU、内存以及运行的操作系统,内存中运行至少一个待打补丁的应用程序。
本发明的实施例以LinuxX86(由Intel推出的一种复杂指令集)系统为例,但不限于Linux操作系统,也可以应用于Solaris、AIX(英文名称:advancedinteractiveexecutive)等类Unix操作系统;同样的,本发明的实施例不限于X86平台,也可以是MIPS(英文名称:microprocessorwithoutinterlockedpipelinestages,中文名称:无内部互锁流水级的微处理器)、ARM(英文名称:advancedRISCmachine,中文名称:先进的精简指令集器件)和PPC(英文别称:PowerPC,英文全称:performanceoptimizationwithenhancedRISC-performancecomputing,中文名称:具有增强RISC高性能计算的性能优化)等其他的处理器平台。
实施例1:
本发明的实施例提供了一种热补丁方法,参照图1所示,包括:
步骤101、在对被补丁程序进行编译时增加动态链接编译选项,使被补丁函数的外部符号添加到动态符号表,以使编译后的外部符号能够被动态链接库重定位,其中被补丁程序包含被补丁函数和外部符号;
步骤102、通过动态链接库方式编译补丁函数,以使编译后的补丁函数能够重定位外部符号,其中,补丁函数为对被补丁函数进行修补的函数;
步骤103、加载补丁函数并且重定位外部符号;
步骤104、激活补丁函数并且去激活被补丁函数。
本发明的实施例提供的热补丁方法,在对被补丁程序进行编译时增加动态链接编译选项,使被补丁函数的外部符号添加到动态符号表,以使编译后的外部符号能够被动态链接库重定位,其中被补丁程序包含被补丁函数和外部符号;通过动态链接库方式编译补丁函数,以使编译后的补丁函数能够重定位外部符号,其中,补丁函数为对被补丁函数进行修补的函数;加载补丁函数并且重定位外部符号;激活补丁函数并且去激活被补丁函数。本发明的实施例通过将被补丁程序中的被补丁函数的外部符号添加到动态符号表并且将补丁函数编译为动态链接库,利用操作系统中的动态链接库加载函数自动对补丁函数所涉及的外部符号进行重定位,利用操作系统对动态链接库的加载、删除自动分配内存的特性来灵活分配内存,同时利用动态链接库中一份动态链接库代码可以被多处使用的优势来使一个补丁文件对应多个应用程序,解决了传统热补丁方法需要重定位、分配内存不灵活和无法实现一个补丁文件对应多个应用程序的问题。
实施例2:
本发明的实施例提供了另一种热补丁方法,参照图2所示,包括:
步骤201、在对被补丁程序进行编译时增加动态链接编译选项,使被补丁函数的外部符号添加到动态符号表,以使编译后的外部符号能够被动态链接库重定位,其中被补丁程序包含被补丁函数和外部符号。
步骤202、配置补丁函数替换表,结合补丁函数生成补丁目标源文件,其中,补丁函数替换表包含补丁函数与被补丁函数的对应关系。
步骤203、对补丁目标源文件进行编译以生成动态链接库格式的补丁文件。
步骤204、加载补丁函数并且重定位外部符号。
步骤205、根据补丁函数替换表获取被补丁函数和补丁函数的地址。
步骤206、根据被补丁函数的地址将被补丁函数入口处的指令替换为跳转指令,其中,跳转指令指示跳转至补丁函数的地址。
步骤207、根据跳转指令跳转至补丁函数,不执行被补丁函数而执行补丁函数。
具体的,在步骤201中,在用编译器对被补丁程序进行编译时增加-rdynamic编译选项,其中,-rdynamic编译选项用于通知链接器进行程序链接时将被补丁程序中的所有符号(包括被补丁函数的外部符号不包括静态符号,其中,外部符号包括全局变量或者全局函数等)添加到动态符号表.dynsym(.dynsym表中存放动态链接所用动态符号表,动态链接库格式的补丁文件加载时调用dlopen函数可以实现向后跟踪动态符号表中的符号)中,或者说加上-rdynamic会把被补丁程序中的所有符号变成全局可见,对于这个被补丁程序而言,它载入的动态链接库在运行时可以直接调用程序中的全局符号。通过编译被补丁程序的时候加上-rdynamic编译选项,在加载动态链接库格式的热补丁文件时,Linux系统就能够调用自带的dlopen函数(dlopen函数用于指示以指定模式打开指定动态链接库文件)自动进行全局符号重定位,而不用补丁制作者去实现复杂的热补丁的全局符号重定位过程,其中,重定位是指将补丁文件中调用的外部符号的地址(一般为0或相对地址)转换为设备上应用程序中的该外部符号的实际地址,将该外部符号的实际地址写入补丁文件。
示例性的,以X86平台为例,以进行编译的源文件为.c文件为例,假设被补丁程序的主程序文件为main_source.c,子模块文件为sub_source1.c和sub_source2.c,编译被补丁程序的命令为:
gcc-rdynamicsub_source1.csub_source2.cmain_source.c-omain_source-ldl
其中,gcc是GNU编译器套装,用于对源程序进行编译;-omain_source编译选项,用于确定输出文件的名称为main_source;-ldl编译选项,表示生成的对象模块需要使用动态链接库。
具体的,在步骤202中,发现被补丁程序中产生错误之后,首先,编辑要修补的缺陷函数(下文简称为被补丁函数)所在源文件,本示例中假设被补丁函数为Func,位于sub_source1.c源文件中,可以在被补丁函数名字后加后缀_PATCH作为补丁函数的名字,本示例中假设Func_Patch函数为被补丁函数Func的补丁函数,修改补丁函数Func_Patch的代码为正确的修复代码,并从sub_source1.c源文件抽取出补丁函数Func_Patch以及相关部分的代码,相关部分具体包括补丁函数使用的头文件定义、使用的变量以及相关函数声明以及内部函数实现,去除补丁函数Func_Patch无关部分,编辑修改后生成补丁源文件sub_source1_patch.c。本示例中sub_source1_patch.c补丁源文件只包含一个补丁函数,当然也可以包含多个补丁函数,每个函数作为一个补丁单元。
同时,在补丁源文件sub_source1_patch.c中配置增加补丁函数替换表,将补丁函数的名字Func_Patch和被补丁函数的名字Func以一一对应关系记录在函数替换表中,至此,补丁函数和补丁函数替换表一起构成了新的补丁源文件,称为补丁目标源文件。
具体的,在步骤203中,使用编译器编译补丁目标源文件sub_source1_patch.c(在本示例中以一个补丁目标源文件为例,当然也可以一起编译多个补丁目标源文件)时增加-shared和-fPIC编译选项,将补丁目标源文件编译为动态链接库格式的补丁文件,编译补丁目标源文件的命令为:
gccsub_source1_patch.c-fPIC-shared-olibsub_source1_patch.so
上述命令生成的动态链接库文件libsub_source1_patch.so即为补丁文件,补丁代码是动态链接库格式的补丁文件中的以补丁函数为单位的指令。
可选地,定义生成一个补丁配置文件(包含补丁版本信息、制作时间、包含的补丁文件个数以及补丁文件名字),对补丁文件用一定的校验工具(比如MD5(英文名称:message-digestalgorithm5,中文名称:消息摘要算法第五版)校验工具)进行校验生成一个补丁校验文件,最后将补丁文件、补丁配置文件以及补丁校验文件一起通过Linux系统下的tar命令(用于创建压缩包)打包生成补丁包。其中,补丁文件可以单独使用,也可以一个或多个补丁文件生成补丁包使用,与补丁文件单独使用相比,生成补丁包的目的在于补丁包更便于管理。
具体的,在步骤204中,为热补丁加载过程。用于将上述制作的补丁文件或补丁包加载到设备。
命令行处理:首先接收由用户输入的补丁加载命令,对补丁加载命令进行参数检查,将补丁加载命令交于热补丁核心管理处理。
热补丁核心管理:调用相关接口进行补丁加载命令的处理。
热补丁加载:对补丁文件进行校验,并使用dlopen函数加载动态链接库格式的补丁文件到系统中。
如果没有在步骤201中所述的在编译被补丁程序时增加-rdynamic编译选项,在步骤204中使用dlopen函数加载动态链接库格式的补丁文件就会报错,报错示例如下:
opendllfailed!
error./libsub_source1_patch.so:undefinedsymbol:xxx
该错误信息为dlopen函数加载补丁文件时,由于补丁文件使用了被补丁程序里的符号(例如全局变量或全局函数),而补丁文件中没有对该符号进行重定位处理。
如果在步骤201中所述的在编译被补丁程序时增加-rdynamic编译选项,则被补丁程序中的所有符号都添加到了动态符号表.dynsym中,在步骤204中dlopen函数可以向后跟踪到被补丁程序的符号表.dynsym中的符号,通过dlopen函数可以成功加载动态链接库格式的补丁文件,而这一切都是Linux操作系统的dlopen函数自动完成,不用补丁制作者去实现补丁文件复杂的重定位过程。相比传统热补丁方法需要补丁制作者去实现复杂的重定位过程而言,本发明的热补丁方法更简单并且可靠性更好。
同时,采用dlopen函数加载动态链接库格式的补丁文件到设备系统中,补丁文件的加载、删除和存放空间都是由Linux操作系统从全局进行规划和管理的,无须为补丁文件预留补丁内存区,也无须补丁文件加载时去动态申请内存作为补丁区,所以这种方式比传统热补丁方法中将热补丁文件加载到补丁预留内存区的方式更灵活。
另外,对于多核多CPU的应用,特别是分布式系统中,运行着多个应用程序,这些应用程序是相同的但运行在不同的CPU上,或者应用程序不同但具有相同的缺陷函数,都需要同样的补丁函数进行修补,因为重定位后不同的应用程序里的符号地址是不同的,所以传统的热补丁方法需要对每个应用程序都做一个补丁文件。本发明所提供的热补丁方法不用补丁制作者对补丁文件里的符号进行重定位,可以满足同一个补丁文件能够适用于多个应用程序的场景。
步骤205至步骤206为热补丁激活过程。
具体的,在步骤205中,参照图3所示,包括:
步骤2051、命令行处理:接收由用户输入的补丁激活命令,对补丁激活命令进行参数检查,将补丁激活命令用于热补丁核心管理。
步骤2052、热补丁核心管理:调用相关接口进行补丁激活命令的处理。
步骤2053、获取补丁函数地址和被补丁函数地址:根据补丁函数替换表中读出的补丁函数的名字Func_Patch和被补丁函数的名字Func获得补丁函数和被补丁函数的地址,在本示例中参照图4所示,假设被补丁函数Func的地址为0x400cc2,补丁函数Func_Patch的地址为0x7f32dc。
具体的,在步骤206中,参照图3所示,包括:
步骤2061、构造跳转指令:利用跳转指令操作符JMP(无条件的转移到指令指定的地址去执行从该地址开始的命令)构造跳转指令以指向补丁函数Func_Patch的地址0x7f32dc,示例性的参照图4所示(使用Intelx8664位平台),构造跳转指令为:JMP0x7f32dc,结合CPU对该指令的解释,这条跳转指令表示CPU将从0x7f32dc处读取指令。
步骤2062、保存被替换的指令:在进行指令替换之前,保存被补丁函数的被替换的指令,当不希望补丁函数起作用时,能够直接恢复被补丁函数的被替换的指令。
步骤2063、进行指令替换:检查被补丁函数是否正在被调用,当被补丁函数没有被调用时,将被补丁函数Func入口地址0x400cc2处的指令替换为跳转指令JMP0x7f32dc,完成指令替换。跳转指令替换的时机是被补丁函数未被调用,这样可以保证热补丁激活的安全性和可靠性。
具体的,在步骤207中,参照图4所示,热补丁激活后发挥作用,当被补丁程序的主调函数调用被补丁函数时,在被补丁函数入口处执行跳转指令JMP0x7f32dc,跳转到补丁函数继续执行,从而避免执行被补丁函数中的其他指令,在补丁函数中的各指令执行完成后再回到主调函数上下文继续执行,所以本发明的热补丁方法有较好的实用性,可以实现不中断业务的情况下对缺陷程序进行修复。
可选的,本发明的实施例还可以进行热补丁确认、热补丁删除以及重启后热补丁恢复三个步骤,这三个步骤是为了完善热补丁的功能。
热补丁确认是确认已经激活运行的热补丁,使补丁函数正式生效。临时激活补丁函数即是在激活热补丁之后没有进行确认,热补丁中的补丁函数只是临时生效,重启系统后补丁函数不再生效;永久激活补丁函数即是在激活热补丁激活之后进行确认,会使热补丁中的补丁函数正式生效,重启系统后补丁函数仍然生效。
热补丁删除是将所有热补丁彻底从系统中清除,考虑到实际应用场景,用户在确认不再需要热补丁的情况下可以执行删除热补丁操作。
设备重启后热补丁恢复是指设备重启后恢复运行重启前的热补丁,即自动重新执行热补丁加载、热补丁激活、热补丁确认过程。这样可以保证热补丁的易用性,重启后不用重新安装热补丁。
本发明的实施例提供的热补丁方法,在对被补丁程序进行编译时增加动态链接编译选项,使被补丁函数的外部符号添加到动态符号表,以使编译后的外部符号能够被动态链接库重定位,其中被补丁程序包含被补丁函数和外部符号;通过动态链接库方式编译补丁函数,以使编译后的补丁函数能够重定位外部符号,其中,补丁函数为对被补丁函数进行修补的函数;加载补丁函数并且重定位外部符号;激活补丁函数并且去激活被补丁函数。本发明的实施例通过将被补丁程序中的被补丁函数的外部符号添加到动态符号表并且将补丁函数编译为动态链接库,利用操作系统中的动态链接库加载函数自动对补丁函数所涉及的外部符号进行重定位,利用操作系统对动态链接库的加载、删除自动分配内存的特性来灵活分配内存,同时利用动态链接库中一份动态链接库代码可以被多处使用的优势来使一个补丁文件对应多个应用程序,解决了传统热补丁方法需要重定位、分配内存不灵活和无法实现一个补丁文件对应多个应用程序的问题。
实施例3:
本发明的实施例提供了一种热补丁装置,用于执行图1中所示的热补丁方法,参照图5所示,包括:
编译单元51,用于在对被补丁程序进行编译时增加动态链接编译选项,使被补丁函数的外部符号添加到动态符号表,以使编译后的外部符号能够被动态链接库重定位,其中被补丁程序包含被补丁函数和外部符号;
制作单元52,用于通过动态链接库方式编译补丁函数,以使编译后的补丁函数能够重定位外部符号,其中,补丁函数为对被补丁函数进行修补的函数;
加载单元53,用于加载补丁函数并且重定位外部符号;
该加载单元53,还用于激活补丁函数并且去激活被补丁函数。
本发明的实施例提供的热补丁装置,在对被补丁程序进行编译时增加动态链接编译选项,使被补丁函数的外部符号添加到动态符号表,以使编译后的外部符号能够被动态链接库重定位,其中被补丁程序包含被补丁函数和外部符号;通过动态链接库方式编译补丁函数,以使编译后的补丁函数能够重定位外部符号,其中,补丁函数为对被补丁函数进行修补的函数;加载补丁函数并且重定位外部符号;激活补丁函数并且去激活被补丁函数。本发明的实施例通过将被补丁程序中的被补丁函数的外部符号添加到动态符号表并且将补丁函数编译为动态链接库,利用操作系统中的动态链接库加载函数自动对补丁函数所涉及的外部符号进行重定位,利用操作系统对动态链接库的加载、删除自动分配内存的特性来灵活分配内存,同时利用动态链接库中一份动态链接库代码可以被多处使用的优势来使一个补丁文件对应多个应用程序,解决了传统热补丁方法需要重定位、分配内存不灵活和无法实现一个补丁文件对应多个应用程序的问题。
可选的,制作单元52具体用于配置补丁函数替换表,结合补丁函数生成补丁目标源文件,其中,补丁函数替换表包含补丁函数与被补丁函数的对应关系;对补丁目标源文件进行编译以生成动态链接库格式的补丁文件。
参照图6所示,制作单元52包括:
代码编辑器521,用于编辑要修补的缺陷函数(简称为被补丁函数)所在源文件,修改补丁函数代码为正确的修复代码以生成补丁函数所在的源文件。
补丁加工模块522,用于对补丁函数所在的源文件进行加工,从该源文件抽取出补丁函数以及相关部分的代码,相关部分具体包括补丁函数使用的头文件定义、使用的变量以及相关函数声明以及内部函数实现,去除补丁函数无关部分。同时,配置增加补丁函数替换表,将补丁函数的名字和被补丁函数的名字以一一对应关系记录在函数替换表中。生成补丁目标源文件。
编译模块523,用于编译补丁目标源文件,生成动态链接库格式的补丁文件。
可选的,加载单元53具体用于根据补丁函数替换表获取被补丁函数和补丁函数的地址;根据被补丁函数的地址将被补丁函数入口处的指令替换为跳转指令,其中,跳转指令指示跳转至补丁函数的地址;根据跳转指令跳转至补丁函数,不执行被补丁函数而执行补丁函数。
可选的,加载单元53,具体用于临时激活补丁函数,使补丁函数临时生效,以使系统重启后补丁函数不生效。
可选的,加载单元53,还具体用于永久激活补丁函数,使补丁函数正式生效,以使系统重启后补丁函数仍然生效。
参照图7所示,加载单元53包括:
命令行处理模块531,用于实现补丁相关的补丁维护命令,包括补丁加载、补丁激活、补丁确认、补丁删除,具体实现命令参数检查、将补丁维护命令交给补丁核心管理模块处理以及将响应结果返回给命令行界面。
热补丁核心管理模块532,用于根据命令行处理模块发送的补丁维护命令,调用其他子模块提供的相关函数接口实现补丁的相关功能。
热补丁加载模块533,用于对补丁文件进行校验,并加载热补丁文件到系统中。
热补丁激活模块534,用于对加载后的热补丁进行临时激活,使补丁函数临时生效。
热补丁确认模块535,用于对激活后的热补丁进行确认,以永久激活热补丁,使补丁函数正式生效,重启系统后补丁函数仍然生效。
热补丁删除模块536,用于将热补丁文件内容全部删除,系统回退到没有热补丁的状态。
重启后热补丁恢复模块537,用于在设备重启后恢复运行重启前的热补丁。即使得在设备重启后自动重新执行热补丁加载、热补丁激活、热补丁确认过程。
本发明的实施例提供的热补丁装置,在对被补丁程序进行编译时增加动态链接编译选项,使被补丁函数的外部符号添加到动态符号表,以使编译后的外部符号能够被动态链接库重定位,其中被补丁程序包含被补丁函数和外部符号;通过动态链接库方式编译补丁函数,以使编译后的补丁函数能够重定位外部符号,其中,补丁函数为对被补丁函数进行修补的函数;加载补丁函数并且重定位外部符号;激活补丁函数并且去激活被补丁函数。本发明的实施例通过将被补丁程序中的被补丁函数的外部符号添加到动态符号表并且将补丁函数编译为动态链接库,利用操作系统中的动态链接库加载函数自动对补丁函数所涉及的外部符号进行重定位,利用操作系统对动态链接库的加载、删除自动分配内存的特性来灵活分配内存,同时利用动态链接库中一份动态链接库代码可以被多处使用的优势来使一个补丁文件对应多个应用程序,解决了传统热补丁方法需要重定位、分配内存不灵活和无法实现一个补丁文件对应多个应用程序的问题。
应理解,在本发明的各种实施例中,上述各过程的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本发明实施例的实施过程构成任何限定。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统、装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。
Claims (10)
1.一种热补丁方法,其特征在于,包括:
在对被补丁程序进行编译时增加动态链接编译选项,使被补丁函数的外部符号添加到动态符号表,以使编译后的所述外部符号能够被动态链接库重定位,其中所述被补丁程序包含所述被补丁函数和所述外部符号;
通过动态链接库方式编译补丁函数,以使编译后的补丁函数能够重定位所述外部符号,其中,所述补丁函数为对所述被补丁函数进行修补的函数;
加载所述补丁函数并且重定位所述外部符号;
激活所述补丁函数并且去激活所述被补丁函数。
2.根据权利要求1所述的热补丁方法,其特征在于,所述通过动态链接库方式编译补丁函数,包括:
配置补丁函数替换表,结合所述补丁函数生成补丁目标源文件,其中,所述补丁函数替换表包含所述补丁函数与所述被补丁函数的对应关系;
对所述补丁目标源文件进行编译以生成动态链接库格式的补丁文件。
3.根据权利要求2所述的热补丁方法,其特征在于,所述激活所述补丁函数并且去激活所述被补丁函数,包括:
根据所述补丁函数替换表获取所述被补丁函数和所述补丁函数的地址;
根据所述被补丁函数的地址将所述被补丁函数入口处的指令替换为跳转指令,其中,所述跳转指令指示跳转至所述补丁函数的地址;
根据所述跳转指令跳转至所述补丁函数,不执行所述被补丁函数而执行所述补丁函数。
4.根据权利要求1所述的热补丁方法,其特征在于,所述激活所述补丁函数,包括:
临时激活所述补丁函数,使所述补丁函数临时生效,以使系统重启后所述补丁函数不生效。
5.根据权利要求1所述的热补丁方法,其特征在于,所述激活所述补丁函数,包括:
永久激活所述补丁函数,使所述补丁函数正式生效,以使系统重启后所述补丁函数仍然生效。
6.一种热补丁装置,其特征在于,包括
编译单元,用于在对被补丁程序进行编译时增加动态链接编译选项,使被补丁函数的外部符号添加到动态符号表,以使编译后的所述外部符号能够被动态链接库重定位,其中所述被补丁程序包含所述被补丁函数和所述外部符号;
制作单元,用于通过动态链接库方式编译补丁函数,以使编译后的补丁函数能够重定位所述外部符号,其中,所述补丁函数为对所述被补丁函数进行修补的函数;
加载单元,用于加载所述补丁函数并且重定位所述外部符号;
所述加载单元,还用于激活所述补丁函数并且去激活所述被补丁函数。
7.根据权利要求6所述的热补丁装置,其特征在于,
所述制作单元,具体用于配置补丁函数替换表,结合所述补丁函数生成补丁目标源文件,其中,所述补丁函数替换表包含所述补丁函数与所述被补丁函数的对应关系;对所述补丁目标源文件进行编译以生成动态链接库格式的补丁文件。
8.根据权利要求7所述的热补丁装置,其特征在于,
所述加载单元,具体用于根据所述补丁函数替换表获取所述被补丁函数和所述补丁函数的地址;根据所述被补丁函数的地址将所述被补丁函数入口处的指令替换为跳转指令,其中,所述跳转指令指示跳转至所述补丁函数的地址;根据所述跳转指令跳转至所述补丁函数,不执行所述被补丁函数而执行所述补丁函数。
9.根据权利要求6所述的热补丁装置,其特征在于,
所述加载单元,具体用于临时激活所述补丁函数,使所述补丁函数临时生效,以使系统重启后所述补丁函数不生效。
10.根据权利要求6所述的热补丁装置,其特征在于,
所述加载单元,具体用于永久激活所述补丁函数,使所述补丁函数正式生效,以使系统重启后所述补丁函数仍然生效。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510996032.6A CN105630557B (zh) | 2015-12-24 | 2015-12-24 | 热补丁方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510996032.6A CN105630557B (zh) | 2015-12-24 | 2015-12-24 | 热补丁方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105630557A true CN105630557A (zh) | 2016-06-01 |
CN105630557B CN105630557B (zh) | 2018-12-28 |
Family
ID=56045538
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510996032.6A Active CN105630557B (zh) | 2015-12-24 | 2015-12-24 | 热补丁方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105630557B (zh) |
Cited By (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107357622A (zh) * | 2017-07-17 | 2017-11-17 | 迈普通信技术股份有限公司 | 热补丁实现方法及通信设备 |
CN108595218A (zh) * | 2018-04-17 | 2018-09-28 | 网宿科技股份有限公司 | 一种加载系统动态库的方法和装置 |
CN108845813A (zh) * | 2018-06-14 | 2018-11-20 | 郑州云海信息技术有限公司 | 一种应用程序热更新方法 |
WO2018209843A1 (zh) * | 2017-05-17 | 2018-11-22 | 华为技术有限公司 | 一种执行热补丁的方法、装置及终端 |
CN108874438A (zh) * | 2018-06-25 | 2018-11-23 | 南京中感微电子有限公司 | 补丁生成方法、装置、电子设备及计算机程序产品 |
CN110275722A (zh) * | 2019-06-21 | 2019-09-24 | 北京百度网讯科技有限公司 | 用于升级应用的方法、装置、设备和存储介质 |
CN110928569A (zh) * | 2019-11-20 | 2020-03-27 | 杭州依赛通信有限公司 | 一种通信设备Live Update功能实现的方法 |
EP3842938A4 (en) * | 2019-05-30 | 2021-12-15 | Huawei Technologies Co., Ltd. | JUMP IMPLEMENTATION PROCESS, DEVICE, AND COMPUTER STORAGE MEDIA |
WO2021249518A1 (zh) * | 2020-06-12 | 2021-12-16 | 中兴通讯股份有限公司 | 热补丁文件生成、一致性检测方法、装置、设备和介质 |
CN115640037A (zh) * | 2022-09-09 | 2023-01-24 | 北京畅游创想软件技术有限公司 | 程序更新方法和装置 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6665735B1 (en) * | 1997-10-06 | 2003-12-16 | Kabushiki Kaisha Toshiba | Method of changing a dynamic link library function efficiently and a computer system for executing the same |
CN103399775A (zh) * | 2013-08-05 | 2013-11-20 | 北京华为数字技术有限公司 | 一种热补丁方法及设备 |
CN104239082A (zh) * | 2013-06-20 | 2014-12-24 | 上海博达数据通信有限公司 | 嵌入式系统的热补丁实现方法 |
-
2015
- 2015-12-24 CN CN201510996032.6A patent/CN105630557B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6665735B1 (en) * | 1997-10-06 | 2003-12-16 | Kabushiki Kaisha Toshiba | Method of changing a dynamic link library function efficiently and a computer system for executing the same |
CN104239082A (zh) * | 2013-06-20 | 2014-12-24 | 上海博达数据通信有限公司 | 嵌入式系统的热补丁实现方法 |
CN103399775A (zh) * | 2013-08-05 | 2013-11-20 | 北京华为数字技术有限公司 | 一种热补丁方法及设备 |
Cited By (18)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2018209843A1 (zh) * | 2017-05-17 | 2018-11-22 | 华为技术有限公司 | 一种执行热补丁的方法、装置及终端 |
CN107357622B (zh) * | 2017-07-17 | 2020-09-22 | 迈普通信技术股份有限公司 | 热补丁实现方法及通信设备 |
CN107357622A (zh) * | 2017-07-17 | 2017-11-17 | 迈普通信技术股份有限公司 | 热补丁实现方法及通信设备 |
CN108595218A (zh) * | 2018-04-17 | 2018-09-28 | 网宿科技股份有限公司 | 一种加载系统动态库的方法和装置 |
CN108595218B (zh) * | 2018-04-17 | 2021-08-27 | 网宿科技股份有限公司 | 一种加载系统动态库的方法和装置 |
CN108845813A (zh) * | 2018-06-14 | 2018-11-20 | 郑州云海信息技术有限公司 | 一种应用程序热更新方法 |
CN108874438A (zh) * | 2018-06-25 | 2018-11-23 | 南京中感微电子有限公司 | 补丁生成方法、装置、电子设备及计算机程序产品 |
CN108874438B (zh) * | 2018-06-25 | 2021-09-21 | 南京中感微电子有限公司 | 补丁生成方法、装置、电子设备及计算机存储介质 |
EP3842938A4 (en) * | 2019-05-30 | 2021-12-15 | Huawei Technologies Co., Ltd. | JUMP IMPLEMENTATION PROCESS, DEVICE, AND COMPUTER STORAGE MEDIA |
JP2022513382A (ja) * | 2019-05-30 | 2022-02-07 | 華為技術有限公司 | 関数ジャンプを実現するための方法、装置及びコンピュータ記憶媒体 |
JP7212793B2 (ja) | 2019-05-30 | 2023-01-25 | 華為技術有限公司 | 関数ジャンプを実現するための方法、装置及びコンピュータ記憶媒体 |
US11645068B2 (en) | 2019-05-30 | 2023-05-09 | Huawei Technologies Co., Ltd. | Method for implementing function jump, apparatus, and computer storage medium |
CN110275722A (zh) * | 2019-06-21 | 2019-09-24 | 北京百度网讯科技有限公司 | 用于升级应用的方法、装置、设备和存储介质 |
CN110275722B (zh) * | 2019-06-21 | 2023-08-08 | 北京百度网讯科技有限公司 | 用于升级应用的方法、装置、设备和存储介质 |
CN110928569A (zh) * | 2019-11-20 | 2020-03-27 | 杭州依赛通信有限公司 | 一种通信设备Live Update功能实现的方法 |
WO2021249518A1 (zh) * | 2020-06-12 | 2021-12-16 | 中兴通讯股份有限公司 | 热补丁文件生成、一致性检测方法、装置、设备和介质 |
CN115640037A (zh) * | 2022-09-09 | 2023-01-24 | 北京畅游创想软件技术有限公司 | 程序更新方法和装置 |
CN115640037B (zh) * | 2022-09-09 | 2023-08-11 | 北京畅游创想软件技术有限公司 | 程序更新方法和装置 |
Also Published As
Publication number | Publication date |
---|---|
CN105630557B (zh) | 2018-12-28 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105630557A (zh) | 热补丁方法和装置 | |
CN101799763B (zh) | 内核在线补丁的方法、装置和系统 | |
CN103744709B (zh) | 补丁加载方法及装置 | |
CN102609328B (zh) | 系统差分升级方法和装置、移动终端 | |
CN103019722B (zh) | 一种抽取Java网络应用升级包的方法及装置 | |
CN103473067A (zh) | 嵌入式Linux分区与数据还原方法、系统及系统开发方法 | |
CN110083360B (zh) | 一种应用程序代码的编译方法、装置、设备及存储介质 | |
CN102799437B (zh) | 一种编译脚本自动生成方法和自动生成装置 | |
CN106406945A (zh) | 一种安卓系统so文件的加载方法及电子设备 | |
CN105159738A (zh) | 一种热补丁实现方法及系统 | |
CN103218428B (zh) | 一种动态链接方法及系统 | |
CN105022678A (zh) | 虚拟机数据备份的方法和装置 | |
CN104915209A (zh) | 一种linux内核跟踪调试与修复问题的方法 | |
Shi et al. | Industry practice of coverage-guided enterprise linux kernel fuzzing | |
CN102902530A (zh) | 一种基于linux嵌入式操作系统的程序校验装置 | |
CN111638884B (zh) | 一种插件化工程编译的方法、系统、装置和存储介质 | |
CN104503823A (zh) | 基于oem操作系统的p2v迁移及配置方法 | |
US11176060B2 (en) | Dynamic memory protection | |
CN103645888A (zh) | 一种自动构建操作系统的系统及方法 | |
CN111142922B (zh) | 应用程序更新方法、装置、终端及服务器 | |
CN104036193B (zh) | 一种应用程序的本地跨域漏洞检测方法及装置 | |
CN104111843A (zh) | 一种基于沙箱的脚本更新方法及系统 | |
CN107301105B (zh) | 校验热补丁或者动态库的方法及装置 | |
CN110928570A (zh) | 一种固件升级的方法及装置、可读存储介质 | |
CN104751026A (zh) | 安卓系统的软件保护方法、软件应用方法及相关装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |