CN107357622A - 热补丁实现方法及通信设备 - Google Patents

热补丁实现方法及通信设备 Download PDF

Info

Publication number
CN107357622A
CN107357622A CN201710582244.9A CN201710582244A CN107357622A CN 107357622 A CN107357622 A CN 107357622A CN 201710582244 A CN201710582244 A CN 201710582244A CN 107357622 A CN107357622 A CN 107357622A
Authority
CN
China
Prior art keywords
patch
function
jump instruction
address
instruction
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
Application number
CN201710582244.9A
Other languages
English (en)
Other versions
CN107357622B (zh
Inventor
李斌
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Maipu Communication Technology Co Ltd
Original Assignee
Maipu Communication Technology Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Maipu Communication Technology Co Ltd filed Critical Maipu Communication Technology Co Ltd
Priority to CN201710582244.9A priority Critical patent/CN107357622B/zh
Publication of CN107357622A publication Critical patent/CN107357622A/zh
Application granted granted Critical
Publication of CN107357622B publication Critical patent/CN107357622B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/445Program loading or initiating
    • G06F9/44521Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
    • G06F9/44526Plug-ins; Add-ons
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/3005Arrangements for executing specific machine instructions to perform operations for flow control
    • G06F9/30069Instruction skipping instructions, e.g. SKIP

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)

Abstract

本发明实施例提供一种热补丁实现方法及通信设备。通信设备安装有补丁文件以及被补丁程序,被补丁程序中包括有补丁跳转中间函数以及被补丁函数,补丁文件中包括有补丁函数。其中,补丁跳转中间函数中配置有长跳转指令,被补丁函数的入口处配置有短跳转指令。该方法包括:被补丁函数在接收到执行指令时,根据短跳转指令跳转至补丁跳转中间函数的长跳转指令处,并通过长跳转指令跳转至补丁函数,以执行补丁函数。本发明提供的技术方案简单可靠,既不影响程序的执行效率,也不会大大增加编译后程序的大小,为通信设备不中断业务的升级提供一种更好的补丁在线升级选择。

Description

热补丁实现方法及通信设备
技术领域
本发明涉及嵌入式操作系统领域,具体而言,涉及一种热补丁实现方法及通信设备。
背景技术
目前,为了提高热补丁的可靠性,现有的技术一般在程序编译时会在每个函数的函数头或者函数尾都插入自定义长跳转指令序列,在补丁激活时补丁函数跳转到函数头或函数尾的长跳转指令处,再通过长跳转指令再跳转补丁函数。然而上述方式大大增加了编译后程序的大小,同时还会影响程序的执行效率,而且预留的自定义指令序列要求的指令不同,预留空间的长短也不同,因而局限性较大。
此外就是利用指令异常处理机制,在补丁激活时将被补丁函数的函数入口第一条指令替换修改为原子操作长度的非法指令,而利用非法指令的异常处理机制来执行补丁函数,实现难度大,通用性差。
发明内容
为了克服现有技术中的上述不足,本发明的目的在于提供一种简单可靠的热补丁实现方法及通信设备,既不影响程序的执行效率,也不会大大增加编译后程序的大小,为通信设备不中断业务的升级提供一种更好的补丁在线升级选择。
为了实现上述目的,本发明较佳实施例采用的技术方案如下:
本发明较佳实施例提供一种热补丁实现方法,应用于通信设备。所述通信设备安装有补丁文件以及被补丁程序,所述被补丁程序中包括有补丁跳转中间函数以及被补丁函数,所述补丁文件中包括有补丁函数。其中,所述补丁跳转中间函数中配置有长跳转指令,所述被补丁函数的入口处配置有短跳转指令。所述方法包括:
所述被补丁函数在接收到执行指令时,根据所述短跳转指令跳转至所述补丁跳转中间函数的长跳转指令处,并通过所述长跳转指令跳转至所述补丁函数,以执行所述补丁函数。其中,所述补丁函数为对所述被补丁函数进行修补的函数。
在本发明较佳实施例中,所述方法还包括:
在对所述被补丁程序进行编译时将被补丁函数的外部符号添加到动态符号表中,以使编译后的所述外部符号能够被动态链接库重定位;
对所述补丁函数进行编译,以使编译后的补丁函数能够重定位所述外部符号;
在接收到补丁函数的激活指令时,加载所述补丁函数并重定位所述外部符号。
在本发明较佳实施例中,所述对所述补丁函数进行编译的步骤,包括:
配置补丁函数替换表;
根据所述补丁函数替换表和所述补丁函数生成补丁目标源文件,其中,所述补丁函数替换表包含所述补丁函数与所述被补丁函数的对应关系;
对所述补丁目标源文件进行编译以生成动态链接库格式的补丁文件。
在本发明较佳实施例中,所述方法还包括:
在所述被补丁程序中配置至少一个补丁跳转中间函数,所述补丁跳转中间函数用于存放长跳转指令。
在本发明较佳实施例中,所述方法还包括:
构建所述长跳转指令和所述短跳转指令;
所述构建所述长跳转指令和所述短跳转指令的步骤,包括:
获取被补丁函数、补丁跳转中间函数和补丁函数的地址;
根据所述被补丁函数、补丁跳转中间函数及补丁函数的地址构建所述被补丁函数到跳转中间函数的短跳转指令,及所述跳转中间函数到补丁函数的长跳转指令。
在本发明较佳实施例中,所述方法还包括:
定义补丁函数地址全局变量,其中,所述补丁函数地址全局变量存放在寄存器中,并用于存放补丁函数地址。
在本发明较佳实施例中,构建所述跳转中间函数到补丁函数的长跳转指令的步骤,包括:
在所述补丁跳转中间函数中添加寄存器跳转指令;
将所述补丁函数的地址赋给所述补丁函数地址全局变量以完成所述长跳转指令的构建。
在本发明较佳实施例中,构建所述跳转中间函数到补丁函数的长跳转指令的步骤,还包括:
将补丁函数地址写入寄存器;
在所述补丁函数地址写入所述寄存器后,构建寄存器跳转指令,以根据所述寄存器跳转指令完成所述长跳转指令的构建。
在本发明较佳实施例中,所述将补丁函数地址写入所述寄存器的步骤,包括:
将所述补丁函数的地址分解为十六进制高四位地址、十六进制中间四位地址以及十六进制低四位地址;
将所述十六进制高四位地址填入寄存器高十六位,低十六位补0;
将所述十六进制中间四位地址与所述寄存器的内容进行或操作;
将所述寄存器的内容逻辑左移十六位;
将所述十六进制低四位地址与所述寄存器的内容进行或操作,以完成所述补丁函数地址的写入。
在本发明较佳实施例中,所述构建所述被补丁函数到跳转中间函数的短跳转指令的步骤,包括:
根据所述被补丁函数的地址和所述补丁函数的地址计算短跳转的相对地址;
根据所述相对地址构建所述短跳转指令,并将所述被补丁函数的入口处的指令替换为所述短跳转指令。
本发明较佳实施例还提供一种通信设备,所述通信设备安装有补丁文件以及被补丁程序,所述被补丁程序中包括有补丁跳转中间函数以及被补丁函数,所述补丁文件中包括有补丁函数。其中,所述补丁跳转中间函数中配置有长跳转指令,所述被补丁函数的入口处配置有短跳转指令。所述通信设备包括:
跳转模块,用于在所述被补丁函数在接收到执行指令时,根据所述短跳转指令跳转至所述补丁跳转中间函数的长跳转指令处,并通过所述长跳转指令跳转至所述补丁函数,以执行所述补丁函数。其中,所述补丁函数为对所述被补丁函数进行修补的函数。
相对于现有技术而言,本发明具有以下有益效果:
本发明实施例提供的热补丁实现方法及通信设备。通信设备安装有补丁文件以及被补丁程序,被补丁程序中包括有补丁跳转中间函数以及被补丁函数,补丁文件中包括有补丁函数。其中,补丁跳转中间函数中配置有长跳转指令,被补丁函数的入口处配置有短跳转指令。该方法包括:被补丁函数在接收到执行指令时,根据短跳转指令跳转至补丁跳转中间函数的长跳转指令处,并通过长跳转指令跳转至补丁函数,以执行补丁函数。上述方法简单可靠,既不影响程序的执行效率,也不会大大增加编译后程序的大小,为通信设备不中断业务的升级提供一种更好的补丁在线升级选择。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本发明的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它相关的附图。
图1为本发明较佳实施例提供的热补丁实现方法的一种流程示意图;
图2为图1中所示的步骤S220包括的各个子步骤的一种流程示意图;
图3为本发明较佳实施例提供的热补丁实现方法的另一种流程示意图;
图4为本发明较佳实施例提供的热补丁实现装置的一种功能模块图。
图标:100-通信设备;110-配置模块;120-构建模块;130-跳转模块。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本发明实施例的组件可以以各种不同的配置来布置和设计。
因此,以下对在附图中提供的本发明的实施例的详细描述并非旨在限制要求保护的本发明的范围,而是仅仅表示本发明的选定实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
下面结合附图,对本发明的一些实施方式作详细说明。在不冲突的情况下,下述的实施例及实施例中的特征可以相互组合。
请参阅图1,为本发明较佳实施例提供的热补丁实现方法的一种流程示意图,所述方法由通信设备100执行。本实施例中,所述通信设备100基于嵌入式Linux系统,或者Solaris、Aix等类Unix操作系统。所述通信设备100安装有补丁文件以及被补丁程序,所述被补丁程序中包括有补丁跳转中间函数以及被补丁函数,所述补丁文件中包括有补丁函数。其中,所述补丁函数为对所述被补丁函数进行修补的函数。所述补丁跳转中间函数中配置有长跳转指令,所述被补丁函数的入口处配置有短跳转指令。
所述短跳转指令(Short Jump Instruction)是在当前指令位置和要跳转的函数位置距离较近时,可以用一条指令长度的跳转指令实现跳转的指令(部分MIPS平台还需要在短跳转指令后增加NOP指令)。所述长跳转指令(Long Jump Instruction)是在当前指令位置和要跳转的函数位置距离较远时,需要要用两条以上的指令实现跳转的指令。所述补丁跳转中间函数(Patch Jump Middle Function)是当被补丁函数和对应的补丁函数距离较远时,通过短跳转指令跳转到的函数。
下面对所述热补丁实现方法的具体流程进行详细阐述。所应说明的是,本发明实施例提供的方法不以图1及以下所述的具体顺序为限制。
步骤S110,在对所述被补丁程序进行编译时将被补丁函数的外部符号添加到动态符号表中,以使编译后的所述外部符号能够被动态链接库重定位。
具体地,本实施例中,可以在用编译器对被补丁程序进行编译时增加-rdynamic编译选项,其中,-rdynamic编译选项用于通知链接器进行程序链接时将被补丁程序中的所有符号(包括被补丁函数的外部符号不包括静态符号,其中,外部符号包括全局变量或者全局函数等)添加到动态符号表.dynsym(.dynsym表中存放动态链接所用动态符号表,动态链接库格式的补丁文件加载时调用dlopen函数可以实现向后跟踪动态符号表中的符号)中,或者说加上-rdynamic会把被补丁程序中的所有符号变成全局可见,对于这个被补丁程序而言,它载入的动态链接库在运行时可以直接调用程序中的全局符号。通过编译被补丁程序的时候加上-rdynamic编译选项,在加载动态链接库格式的热补丁文件时,Linux系统就能够调用自带的dlopen函数(dlopen函数用于指示以指定模式打开指定动态链接库文件)自动进行全局符号重定位,而不用补丁制作者去实现复杂的热补丁的全局符号重定位过程,其中,重定位是指将补丁文件中调用的外部符号的地址(一般为0或相对地址)转换为设备上应用程序中的该外部符号的实际地址,将该外部符号的实际地址写入补丁文件。
作为示例,以进行编译的源文件为.c文件为例,假设被补丁程序的源主程序文件为main_source.c,子模块文件为sub_source1.c和sub_source2.c,编译被补丁程序的命令为:
gcc-rdynamic sub_source1.c sub_source2.c main_source.c–omain_source-ldl
其中,gcc是GNU编译器套装,用于对源程序进行编译;-omain_source编译选项,用于确定输出文件的名称为main_source;-ldl编译选项,表示生成的对象模块需要使用动态链接库。
步骤S120,对所述补丁函数进行编译,以使编译后的补丁函数能够重定位所述外部符号。
详细地,作为一种实施方式,请参阅图2,所述步骤S120可以包括以下子步骤:
子步骤S121,配置补丁函数替换表。
本实施例中,发现被补丁程序中产生错误之后,首先,编辑要修补的被补丁函数所在源文件,本示例中假设被补丁函数为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以一一对应关系记录在函数替换表中,至此,补丁函数和补丁函数替换表一起构成了新的补丁源文件,称为补丁目标源文件。
子步骤S122,根据所述补丁函数替换表和所述补丁函数生成补丁目标源文件。
子步骤S123,对所述补丁目标源文件进行编译以生成动态链接库格式的补丁文件。
本实施例中,所述补丁函数替换表包含所述补丁函数与所述被补丁函数的对应关系。可以通过使用编译器编译补丁目标源文件sub_source1_patch.c(在本示例中以一个补丁目标源文件为例,当然也可以一起编译多个补丁目标源文件)时增加-shared和-fPIC编译选项,将补丁目标源文件编译为动态链接库格式的补丁文件,编译补丁目标源文件的命令为:
gcc sub_source1_patch.c–fPIC–shared–o libsub_source1_patch.so
上述命令生成的动态链接库文件libsub_source1_patch.so即为补丁文件,补丁代码是动态链接库格式的补丁文件中的以补丁函数为单位的指令。
可选地,还可以定义生成一个补丁配置文件(包含补丁版本信息、制作时间、包含的补丁文件个数以及补丁文件名字),对补丁文件用一定的校验工具进行校验生成一个补丁校验文件,最后将补丁文件、补丁配置文件以及补丁校验文件一起通过Linux系统下的tar命令(用于创建压缩包)打包生成补丁包。其中,补丁文件可以单独使用,也可以一个或多个补丁文件生成补丁包使用,与补丁文件单独使用相比,生成补丁包的目的在于补丁包更便于管理。
基于上述设计,采用dlopen函数加载动态链接库格式的补丁文件到设备系统中,补丁文件的加载、删除和存放空间都是由Linux操作系统从全局进行规划和管理的,无须为补丁文件预留补丁内存区,也无须补丁文件加载时去动态申请内存作为补丁区,所以这种方式比传统热补丁方法中将热补丁文件加载到补丁预留内存区的方式更灵活。
另外,对于多核多CPU的应用,特别是分布式系统中,运行着多个应用程序,这些应用程序是相同的但运行在不同的CPU上,或者应用程序不同但具有相同的缺陷函数,都需要同样的补丁函数进行修补,因为重定位后不同的应用程序里的符号地址是不同的,所以传统的热补丁方法需要对每个应用程序都做一个补丁文件。本发明所提供的热补丁方法不用补丁制作者对补丁文件里的符号进行重定位,动态链接库自身的优势就是一份动态链接库代码,可以被多处使用,所以对同一补丁代码对多个应用程序的应用,可以满足同一个补丁文件能够适用于多个应用程序的场景。
步骤S130,在接收到补丁函数的激活指令时,加载所述补丁函数并重定位所述外部符号。
本实施例中,在接收到补丁安装命令时加载所述补丁文件到通信设备100中,具体地,可以通过dlopen函数加载动态链接库格式的补丁文件,补丁文件的加载、删除和存放空间都是由Linux操作系统从全局进行规划和管理的,无须为补丁文件预留补丁内存区,也无须补丁文件加载时去动态申请内存作为补丁区,所以这种方式比传统热补丁方法中将热补丁文件加载到补丁预留内存区的方式更灵活。
另外,对于多核多CPU的应用,特别是分布式系统中,运行着多个应用程序,这些应用程序是相同的但运行在不同的CPU上,或者应用程序不同但具有相同的缺陷函数,都需要同样的补丁函数进行修补,因为重定位后不同的应用程序里的符号地址是不同的,所以传统的热补丁方法需要对每个应用程序都做一个补丁文件。本发明所提供的热补丁方法不用补丁制作者对补丁文件里的符号进行重定位,可以满足同一个补丁文件能够适用于多个应用程序的场景。
步骤S150,所述被补丁函数在接收到执行指令时,根据所述短跳转指令跳转至所述补丁跳转中间函数的长跳转指令处,并通过所述长跳转指令跳转至所述补丁函数,以执行所述补丁函数。
详细地,本实施例中,所述被补丁函数在被被补丁程序调用时,由于所述被补丁函数的入口处配置有短跳转指令,所述被补丁函数可以通过所述短跳转指令跳转至所述补丁跳转中间函数的长跳转指令处,然后再通过所述长跳转指令再跳转至所述补丁函数,从而执行所述补丁函数。
基于上述设计,本实施例通过在被补丁程序中预留补丁跳转中间函数,与现有技术中修改编译器在编译时每个函数的函数头或者函数插入自定义的指令方案相比,该方案简单灵活,不会大大增加编译后程序大小,也不会影响被补丁程序的执行效率,而且具有较好的可靠性。
请进一步参阅图3,所述方法还可以包括:
步骤S140,构建长跳转指令和短跳转指令。
本实施例中,首先需要在所述被补丁程序中配置至少一个补丁跳转中间函数,所述补丁跳转中间函数可以以指定数量的空指令代码填充或者指定数量的长跳转指令填充,根据源程序大小,可以配置一个或多个补丁跳转中间函数。
作为一种实施方式,以MIPS(64位)平台为例,其中补丁跳转中间函数可以用NOP空指令,如下所示:
对于ARM64平台,本实施例中,以所述被补丁程序文件为.c文件为例,首先,定义补丁函数地址全局变量,补丁函数地址全局变量用于存放补丁函数地址,如下所示:
unsigned long gPatchFuncAddr1;
unsigned long gPatchFuncAddr2;
……
然后,定义补丁跳转中间函数,补丁跳转中间函数由寄存器跳转的长跳转指令组成,在构造好长跳转指令时,在补丁文件激活时只需赋补丁函数地址的值给gPatchFuncAddr1等补丁地址全局变量,具体如下所示:
在配置好补丁跳转中间函数后,本实施例中,构建所述长跳转指令和所述短跳转指令流程为:首先,获取被补丁函数、补丁跳转中间函数和补丁函数的地址,然后根据所述被补丁函数、补丁跳转中间函数及补丁函数的地址构建所述被补丁函数到跳转中间函数的短跳转指令,及所述跳转中间函数到补丁函数的长跳转指令。
下面分别对短跳转指令和长跳转指令的构建进行详细阐述。
首先对所述短跳转指令的构建进行阐述。作为一种实施方式,对于MIPS(64位)平台,MIPS(64位)平台的短跳转指令可以使用MIPS平台下的跳转指令j实现,跳转j指令操作码域占6位(j指令编码为000010),剩下的26位用于跳转目标的编址,最大的短跳转地址为256M。上述跳转地址为绝对地址而不是相对地址,由于MIPS所有指令在内存中都是4字节对齐的,因此最低的2位地址位是无需存储的,所以后26位存储的跳转地址是跳转目标地址除以4后的数值。例如,所述被补丁函数的地址为297882960,所述补丁跳转中间函数地址为302363472,那么302363472除以4结果为75590868。然后计算75590868的二进制编码,以高字节序为例,75590868二进制编码为100100000010110110011010100,j指令编码为000010加后边跳转地址00100000010110110011010100(100100000010110110011010100取26位),组合后的短跳转指令为二进制00001000100000010110110011010100。
值得注意的是,部分MIPS平台由于流水线问题,还需要在短跳转指令后加一个NOP指令,编码为二进制00000000000000000000000000000000(32个0)。
此外,对于ARM(64位)平台而言,短跳转指令构造方法为,首先根据补丁跳转中间函数区的地址addrPatchJmpMiddleArea以及所述被补丁函数的地址addrSourceFunc,计算跳转的相对地址为jmpAddr=addrPatchJmpMiddleArea-addrSourceFunc,短跳转指令为(unsigned)((0x14000000&0xfc000000)+(unsigned long)jmpAddr/4)。
接下来结合ARM(64位)平台和MIPS(64位)平台对所述长跳转指令的构造进行阐述。
对于ARM(64位),首先需要定义补丁函数全局变量,所述补丁函数全局变量存放在寄存器中,以用于存放补丁函数地址,然后定义补丁跳转中间函数。具体地,所述补丁跳转中间函数可由寄存器跳转的长跳转指令组成,通过在所述补丁跳转中间函数中添加寄存器跳转的长跳转指令,在所述补丁文件激活时将所述补丁函数的地址赋给所述补丁函数地址全局变量以完成所述长跳转指令的构建。详细地,在补丁激活时,只需赋补丁函数地址的值给gPatchFuncAddr1等补丁地址全局变量,具体如下所示:
通过上述设计,由于补丁跳转中间函数已经存放了寄存器跳转指令,具体在补丁激活时只需将补丁函数地址赋给gPatchFuncAddr1等对应全局变量,由于所述寄存器里面存放的是gPatchFuncAddr1等对应全局变量的值,也就是说在补丁文件激活后,所述被补丁函数执行时,所述寄存器里面存放的值为所述补丁函数的地址,如此,通过寄存器跳转就可以实现被补丁函数跳转到补丁函数,从而执行所述补丁函数。
对于MIPS(64位)平台,所述长跳转指令可以使用寄存器跳转指令实现,首先需要将补丁函数的地址写入寄存器中,然后构造指令以跳转寄存器内的地址。
具体地,首先将补丁函数地址分解为highAddr(十六进制高四位地址)、middleAddr(十六进制中间四位地址)和lowAddr(十六进制低四位地址),然后可以使用lui指令将highAddr填入寄存器的高16位,低16位补0,使用ori指令将middleAddr与t9寄存器的内容进行或操作,使用dsll指令将t9寄存器的内容逻辑左移16位,使用ori指令将lowAddr与t9寄存器的内容做或操作,最后,构造寄存器跳转指令jr t9,以完成所述长跳转指令的构建。
请参阅图4,本发明较佳实施例还提供一种通信设备100,包括:
跳转模块130,用于在所述被补丁函数在接收到执行指令时,根据所述短跳转指令跳转至所述补丁跳转中间函数的长跳转指令处,并通过所述长跳转指令跳转至所述补丁函数,以执行所述补丁函数,其中,所述补丁函数为对所述被补丁函数进行修补的函数。
进一步地,所述通信设备100还包括:
配置模块110,用于在所述被补丁程序中配置至少一个补丁跳转中间函数,所述补丁跳转中间函数用于存放长跳转指令。
进一步地,所述通信设备100还包括:
构建模块120,用于构建所述长跳转指令和所述短跳转指令;
其中,所述构建所述长跳转指令和所述短跳转指令的方式,包括:
获取被补丁函数、补丁跳转中间函数和补丁函数的地址;
根据所述被补丁函数、补丁跳转中间函数及补丁函数的地址构建所述被补丁函数到跳转中间函数的短跳转指令,及所述跳转中间函数到补丁函数的长跳转指令。
综上所述,本发明实施例提供的热补丁实现方法及通信设备100。通信设备100安装有补丁文件以及被补丁程序,被补丁程序中包括有补丁跳转中间函数以及被补丁函数,补丁文件中包括有补丁函数。其中,补丁跳转中间函数中配置有长跳转指令,被补丁函数的入口处配置有短跳转指令。该方法包括:被补丁函数在接收到执行指令时,根据短跳转指令跳转至补丁跳转中间函数的长跳转指令处,并通过长跳转指令跳转至补丁函数,以执行补丁函数。上述方法简单可靠,既不影响程序的执行效率,也不会大大增加编译后程序的大小,为通信设备100不中断业务的升级提供一种更好的补丁在线升级选择。
需要说明的是,在本文中,术语"包括"、"包含"或者其任何其它变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其它要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句"包括一个……"限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
对于本领域技术人员而言,显然本发明不限于上述示范性实施例的细节,而且在不背离本发明的精神或基本特征的情况下,能够以其它的具体形式实现本发明。因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本发明的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化囊括在本发明内。不应将权利要求中的任何附图标记视为限制所涉及的权利要求。

Claims (13)

1.一种热补丁实现方法,应用于通信设备,其特征在于,所述通信设备安装有补丁文件以及被补丁程序,所述被补丁程序中包括有补丁跳转中间函数以及被补丁函数,所述补丁文件中包括有补丁函数,其中,所述补丁跳转中间函数中配置有长跳转指令,所述被补丁函数的入口处配置有短跳转指令,所述方法包括:
所述被补丁函数在接收到执行指令时,根据所述短跳转指令跳转至所述补丁跳转中间函数的长跳转指令处,并通过所述长跳转指令跳转至所述补丁函数,以执行所述补丁函数,其中,所述补丁函数为对所述被补丁函数进行修补的函数。
2.根据权利要求1所述的热补丁实现方法,其特征在于,所述方法还包括:
在对所述被补丁程序进行编译时将被补丁函数的外部符号添加到动态符号表中,以使编译后的所述外部符号能够被动态链接库重定位;
对所述补丁函数进行编译,以使编译后的补丁函数能够重定位所述外部符号;
在接收到补丁函数的激活指令时,加载所述补丁函数并重定位所述外部符号。
3.根据权利要求2所述的热补丁实现方法,其特征在于,所述对所述补丁函数进行编译的步骤,包括:
配置补丁函数替换表;
根据所述补丁函数替换表和所述补丁函数生成补丁目标源文件,其中,所述补丁函数替换表包含所述补丁函数与所述被补丁函数的对应关系;
对所述补丁目标源文件进行编译以生成动态链接库格式的补丁文件。
4.根据权利要求1所述的热补丁实现方法,其特征在于,所述方法还包括:
在所述被补丁程序中配置至少一个补丁跳转中间函数,所述补丁跳转中间函数用于存放长跳转指令。
5.根据权利要求1所述的热补丁实现方法,其特征在于,所述方法还包括:
构建所述长跳转指令和所述短跳转指令;
所述构建所述长跳转指令和所述短跳转指令的步骤,包括:
获取被补丁函数、补丁跳转中间函数和补丁函数的地址;
根据所述被补丁函数、补丁跳转中间函数及补丁函数的地址构建所述被补丁函数到跳转中间函数的短跳转指令,及所述跳转中间函数到补丁函数的长跳转指令。
6.根据权利要求5所述的热补丁实现方法,其特征在于,所述方法还包括:
定义补丁函数地址全局变量,其中,所述补丁函数地址全局变量存放在寄存器中,并用于存放补丁函数地址。
7.根据权利要求6所述的热补丁实现方法,其特征在于,构建所述跳转中间函数到补丁函数的长跳转指令的步骤,包括:
在所述补丁跳转中间函数中添加寄存器跳转指令;
将所述补丁函数的地址赋给所述补丁函数地址全局变量以完成所述长跳转指令的构建。
8.根据权利要求5所述的热补丁实现方法,其特征在于,构建所述跳转中间函数到补丁函数的长跳转指令的步骤,还包括:
将补丁函数地址写入寄存器;
在所述补丁函数地址写入所述寄存器后,构建寄存器跳转指令,以根据所述寄存器跳转指令完成所述长跳转指令的构建。
9.根据权利要求8所述的热补丁实现方法,其特征在于,所述将补丁函数地址写入所述寄存器的步骤,包括:
将所述补丁函数的地址分解为十六进制高四位地址、十六进制中间四位地址以及十六进制低四位地址;
将所述十六进制高四位地址填入寄存器高十六位,低十六位补0;
将所述十六进制中间四位地址与所述寄存器的内容进行或操作;
将所述寄存器的内容逻辑左移十六位;
将所述十六进制低四位地址与所述寄存器的内容进行或操作,以完成所述补丁函数地址的写入。
10.根据权利要求5所述的热补丁实现方法,其特征在于,所述构建所述被补丁函数到跳转中间函数的短跳转指令的步骤,包括:
根据所述被补丁函数的地址和所述补丁函数的地址计算短跳转的相对地址;
根据所述相对地址构建所述短跳转指令,并将所述被补丁函数的入口处的指令替换为所述短跳转指令。
11.一种通信设备,其特征在于,所述通信设备安装有补丁文件以及被补丁程序,所述被补丁程序中包括有补丁跳转中间函数以及被补丁函数,所述补丁文件中包括有补丁函数,其中,所述补丁跳转中间函数中配置有长跳转指令,所述被补丁函数的入口处配置有短跳转指令,所述通信设备包括:
跳转模块,用于在所述被补丁函数在接收到执行指令时,根据所述短跳转指令跳转至所述补丁跳转中间函数的长跳转指令处,并通过所述长跳转指令跳转至所述补丁函数,以执行所述补丁函数,其中,所述补丁函数为对所述被补丁函数进行修补的函数。
12.根据权利要求11所述的通信设备,其特征在于,所述通信设备还包括:
配置模块,用于在所述被补丁程序中配置至少一个补丁跳转中间函数,所述补丁跳转中间函数用于存放长跳转指令。
13.根据权利要求11所述的通信设备,其特征在于,所述通信设备还包括:
构建模块,用于构建所述长跳转指令和所述短跳转指令;
其中,所述构建所述长跳转指令和所述短跳转指令的方式,包括:
获取被补丁函数、补丁跳转中间函数和补丁函数的地址;
根据所述被补丁函数、补丁跳转中间函数及补丁函数的地址构建所述被补丁函数到跳转中间函数的短跳转指令,及所述跳转中间函数到补丁函数的长跳转指令。
CN201710582244.9A 2017-07-17 2017-07-17 热补丁实现方法及通信设备 Active CN107357622B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201710582244.9A CN107357622B (zh) 2017-07-17 2017-07-17 热补丁实现方法及通信设备

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201710582244.9A CN107357622B (zh) 2017-07-17 2017-07-17 热补丁实现方法及通信设备

Publications (2)

Publication Number Publication Date
CN107357622A true CN107357622A (zh) 2017-11-17
CN107357622B CN107357622B (zh) 2020-09-22

Family

ID=60292686

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201710582244.9A Active CN107357622B (zh) 2017-07-17 2017-07-17 热补丁实现方法及通信设备

Country Status (1)

Country Link
CN (1) CN107357622B (zh)

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108874438A (zh) * 2018-06-25 2018-11-23 南京中感微电子有限公司 补丁生成方法、装置、电子设备及计算机程序产品
US10649763B2 (en) * 2018-06-15 2020-05-12 Microsoft Technology Licensing, Llc Resource efficient deployment of multiple hot patches
CN114168489A (zh) * 2022-02-08 2022-03-11 统信软件技术有限公司 一种函数信息获取方法、计算设备及存储介质
CN115640037A (zh) * 2022-09-09 2023-01-24 北京畅游创想软件技术有限公司 程序更新方法和装置
WO2024088151A1 (zh) * 2022-10-25 2024-05-02 华为技术有限公司 一种获得补丁包的方法及通信装置

Citations (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101004681A (zh) * 2006-12-22 2007-07-25 中兴通讯股份有限公司 嵌入式系统动态补丁长跳转的实现方法
CN102156661A (zh) * 2010-02-11 2011-08-17 华为技术有限公司 在线补丁的激活方法、装置及系统
US20120159463A1 (en) * 2010-12-20 2012-06-21 Oracle International Corporation Method and system for creating, applying, and removing a software fix
CN105159738A (zh) * 2015-08-20 2015-12-16 上海斐讯数据通信技术有限公司 一种热补丁实现方法及系统
CN105573788A (zh) * 2015-12-15 2016-05-11 华为技术有限公司 补丁处理的方法和设备以及生成补丁的方法和设备
CN105607937A (zh) * 2015-12-25 2016-05-25 京信通信技术(广州)有限公司 一种热补丁方法及设备
CN105630557A (zh) * 2015-12-24 2016-06-01 迈普通信技术股份有限公司 热补丁方法和装置
CN105786537A (zh) * 2014-12-24 2016-07-20 中兴通讯股份有限公司 一种热补丁的实现方法和装置
CN105988798A (zh) * 2015-02-12 2016-10-05 中兴通讯股份有限公司 补丁处理方法及装置
CN106775671A (zh) * 2016-11-30 2017-05-31 武汉虹信通信技术有限责任公司 一种用于通信系统linux环境中的热补丁修复方法
CN106874022A (zh) * 2015-12-11 2017-06-20 中兴通讯股份有限公司 一种热补丁注入方法及装置

Patent Citations (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101004681A (zh) * 2006-12-22 2007-07-25 中兴通讯股份有限公司 嵌入式系统动态补丁长跳转的实现方法
CN102156661A (zh) * 2010-02-11 2011-08-17 华为技术有限公司 在线补丁的激活方法、装置及系统
US20120159463A1 (en) * 2010-12-20 2012-06-21 Oracle International Corporation Method and system for creating, applying, and removing a software fix
CN105786537A (zh) * 2014-12-24 2016-07-20 中兴通讯股份有限公司 一种热补丁的实现方法和装置
CN105988798A (zh) * 2015-02-12 2016-10-05 中兴通讯股份有限公司 补丁处理方法及装置
CN105159738A (zh) * 2015-08-20 2015-12-16 上海斐讯数据通信技术有限公司 一种热补丁实现方法及系统
CN106874022A (zh) * 2015-12-11 2017-06-20 中兴通讯股份有限公司 一种热补丁注入方法及装置
CN105573788A (zh) * 2015-12-15 2016-05-11 华为技术有限公司 补丁处理的方法和设备以及生成补丁的方法和设备
CN105630557A (zh) * 2015-12-24 2016-06-01 迈普通信技术股份有限公司 热补丁方法和装置
CN105607937A (zh) * 2015-12-25 2016-05-25 京信通信技术(广州)有限公司 一种热补丁方法及设备
CN106775671A (zh) * 2016-11-30 2017-05-31 武汉虹信通信技术有限责任公司 一种用于通信系统linux环境中的热补丁修复方法

Cited By (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10649763B2 (en) * 2018-06-15 2020-05-12 Microsoft Technology Licensing, Llc Resource efficient deployment of multiple hot patches
CN108874438A (zh) * 2018-06-25 2018-11-23 南京中感微电子有限公司 补丁生成方法、装置、电子设备及计算机程序产品
CN114168489A (zh) * 2022-02-08 2022-03-11 统信软件技术有限公司 一种函数信息获取方法、计算设备及存储介质
CN114168489B (zh) * 2022-02-08 2022-12-30 统信软件技术有限公司 一种函数信息获取方法、计算设备及存储介质
CN115640037A (zh) * 2022-09-09 2023-01-24 北京畅游创想软件技术有限公司 程序更新方法和装置
CN115640037B (zh) * 2022-09-09 2023-08-11 北京畅游创想软件技术有限公司 程序更新方法和装置
WO2024088151A1 (zh) * 2022-10-25 2024-05-02 华为技术有限公司 一种获得补丁包的方法及通信装置

Also Published As

Publication number Publication date
CN107357622B (zh) 2020-09-22

Similar Documents

Publication Publication Date Title
CN107357622A (zh) 热补丁实现方法及通信设备
CN102298535B (zh) 绑定数据并行设备源代码
US9952841B2 (en) Programming system and language for application development
CN100353278C (zh) 用于类型安全语言环境的方法、处理器和系统
US20140123109A1 (en) System and method for testing compiler implementation using dynamic combinatorial test generation
CN101673236B (zh) 一种全覆盖的微处理器测试用例包自动生成方法
CN104820613B (zh) 一种异构多核程序的编译方法
US20100138815A1 (en) Implementing aspects with callbacks in virtual machines
US9703622B2 (en) Detection of data corruption in a data processing device
CN102156661A (zh) 在线补丁的激活方法、装置及系统
CN101243412B (zh) 用于安全检查模块中的可执行应用程序的系统和方法
CN102246150A (zh) 转换用户脚本代码来进行调试
CN101859244A (zh) 多工具链工程构建方法及系统
CN102495736A (zh) 一种在可执行文件中标识软件代码svn版本的方法和系统
CN103218262A (zh) 在线补丁的激活方法、装置及系统
CN108647061A (zh) 系统隐藏方法的调用方法、装置和计算设备
CN102257474B (zh) 多个运行时容器共享的值解析
CN103309718B (zh) 在工业组态软件中二次开发的方法
US8806453B1 (en) Integrating disparate programming languages to form a new programming language
CN102023884A (zh) 一种嵌入式系统开发程序校验码自动生成的方法
CN100504761C (zh) 在不同种类的体系结构中映射调试信息的方法
CN105278445A (zh) 同步发电机励磁调节器控制程序的二次开发方法
CN110413314A (zh) 一种文件发布方法、装置、设备及存储介质
CN107479920A (zh) 一种单elf文件实现多操作系统加载的方法
CN101685405A (zh) 用于不再有货的微控制器的仿真系统和仿真方法

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant