CN103197942B - 一种补丁的生成方法、打补丁的方法及装置 - Google Patents

一种补丁的生成方法、打补丁的方法及装置 Download PDF

Info

Publication number
CN103197942B
CN103197942B CN201310086466.3A CN201310086466A CN103197942B CN 103197942 B CN103197942 B CN 103197942B CN 201310086466 A CN201310086466 A CN 201310086466A CN 103197942 B CN103197942 B CN 103197942B
Authority
CN
China
Prior art keywords
function
inline
address
patch
inline function
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.)
Expired - Fee Related
Application number
CN201310086466.3A
Other languages
English (en)
Other versions
CN103197942A (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.)
Huawei Technologies Co Ltd
Original Assignee
Huawei Technologies 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 Huawei Technologies Co Ltd filed Critical Huawei Technologies Co Ltd
Priority to CN201310086466.3A priority Critical patent/CN103197942B/zh
Publication of CN103197942A publication Critical patent/CN103197942A/zh
Application granted granted Critical
Publication of CN103197942B publication Critical patent/CN103197942B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Landscapes

  • Stored Programmes (AREA)

Abstract

本发明的实施例提供一种补丁的生成方法、打补丁的方法及装置,涉及计算机领域,能够方便地对经过inline优化的函数打热补丁,从而为经过函数内联的应用程序的快速修复提供了保障。该方法包括:将内联函数与所述被内联函数进行函数内联,以生成第三函数;根据所述第三函数,生成等价于所述第三函数的等价代码段;获取用于存放所述内联函数及所述被内联函数的地址;获取用于修复所述被内联函数的第一修复函数;根据所述地址,将所述等价代码段中的所述被内联函数替换为所述第一修复函数,以生成补丁文件;输出所述地址及所述补丁文件至用户端设备,以使所述用户端设备根据所述地址及所述补丁文件修复所述被内联函数。

Description

一种补丁的生成方法、打补丁的方法及装置
技术领域
本发明涉及计算机领域,尤其涉及一种补丁的生成方法、打补丁的方法及装置。
背景技术
随着编译器优化性能的不断提高,与未经编译器优化的代码的性能相比,经过编译器优化后的代码的性能明显优于未经过编译器优化的代码的性能。
目前,在应用程序开发过程中,难免存在一些软件设计方面的漏洞或用户对该应用程序的新的需求,为了不影响应用程序的使用,一般以热补丁的方式对该应用程序进行漏洞修复或更新,即在不中止应用程序的情况下对该应用程序进行修复或更新。热补丁的处理方式基本是以函数为单位的,即可通过对出现漏洞或需要更新的函数进行修复,以实现对该应用程序的修复。
现有技术中,若应用程序的函数之间没有经过编译器的inline(函数内联)优化,则可直接以热补丁的处理方式对出现漏洞或需要更新的函数进行修复或更新;若应用程序的函数之间进行了inline优化,则当应用程序中的某一个函数出现漏洞或需要更新时,软件开发人员则需要重新设计进行inline优化的所有函数,从而以完成对该应用程序的修复或更新。
然而,上述未经inline优化的函数,虽然可直接对出现漏洞或需要更新的函数进行修复或更新,但是,未经inline优化的函数对最终生成的应用程序的性能有很大的影响;而经过inline优化的函数,为了修复或更新应用程序中的某一个函数,软件开发人员除了重新设计需要修复或更新的该函数外,往往还需重新设计进行inline优化的其他函数,若将该其他函数加载到有限的补丁区,则严重缩短了补丁区的生命周期。
发明内容
本发明的实施例提供一种补丁的生成方法、打补丁的方法及装置,能够在函数内联优化与热补丁共存的同时,快速地修复经过函数内联的应用程序。
为达到上述目的,本发明的实施例采用如下技术方案:
第一方面,本发明实施例提供一种补丁的生成方法,应用于对被内联函数打补丁的场景,包括:
将内联函数与所述被内联函数进行函数内联,以生成第三函数;
根据所述第三函数,生成等价于所述第三函数的等价代码段;
获取用于存放所述内联函数及所述被内联函数的地址;
获取用于修复所述被内联函数的第一修复函数;
根据所述地址,将所述等价代码段中的所述被内联函数替换为所述第一修复函数,以生成补丁文件;
输出所述地址及所述补丁文件至用户端设备,以使所述用户端设备根据所述地址及所述补丁文件修复所述被内联函数。
在第一方面的第一种可能的实现方式中,所述根据所述第三函数,生成等价于所述第三函数的等价代码段的方法具体包括:
根据所述第三函数,确定所述内联函数对所述被内联函数进行函数调用的调用关系;
根据所述调用关系,生成所述等价代码段。
结合前述的第一方面或第一方面的第一种可能的实现方式,在第二种可能的实现方式中,所述等价代码段保存于可执行链接格式ELF文件中。
第二方面,本发明实施例还提供一种打补丁的方法,应用于对被内联函数打补丁的场景,包括:
接收来自服务端设备的地址及补丁文件,其中,所述地址为所述服务端设备获取的用于存放内联函数及所述被内联函数的地址,
所述补丁文件为所述服务端设备将所述内联函数与所述被内联函数进行函数内联,以生成第三函数,并根据所述第三函数,生成等价于所述第三函数的等价代码段,且获取用于存放所述内联函数及所述被内联函数的地址,以及获取用于修复所述被内联函数的第一修复函数后,所述服务端设备根据所述地址,将所述等价代码段中的所述被内联函数替换为所述第一修复函数生成的;
根据所述地址及所述补丁文件修复所述被内联函数。
在第二方面的第一种可能的实现方式中,所述根据所述地址及所述补丁文件修复所述被内联函数的方法具体包括:
根据所述地址,将所述被内联函数的代码修改为跳转指令,所述跳转指令用于指示所述补丁文件的起始地址;
根据所述跳转指令,执行所述补丁文件,以修复所述被内联函数。
结合前述的第二方面或第二方面的第一种可能的实现方式,在第二种可能的实现方式中,所述等价代码段保存于ELF文件中。
第三方面,本发明实施例提供一种服务端设备,应用于对被内联函数打补丁的场景,包括:
第一处理单元,用于将内联函数与所述被内联函数进行函数内联,以生成第三函数,并根据所述第三函数,生成等价于所述第三函数的等价代码段;
第一获取单元,用于获取用于存放所述内联函数及所述被内联函数的地址,以及获取用于修复所述被内联函数的第一修复函数;
所述第一处理单元,还用于根据所述地址,将所述等价代码段中所述被内联函数替换为所述第一修复函数,以生成补丁文件;
第一输出单元,用于输出所述地址及所述补丁文件至用户端设备,以使所述用户端设备根据所述地址及所述补丁文件修复所述被内联函数。
在第三方面的第一种可能的实现方式中,
所述第一处理单元,具体用于根据所述第三函数,确定所述内联函数对所述被内联函数进行函数调用的调用关系,以及根据所述调用关系,生成所述等价代码段。
结合前述的第三方面或第三方面的第一种可能的实现方式,在第二种可能的实现方式中,所述等价代码段保存于ELF文件中。
第四方面,本发明实施例提供一种用户端设备,应用于对被内联函数打补丁的场景,包括:
第二接收单元,用于接收来自服务端设备的地址及补丁文件,其中,所述地址为所述服务端设备获取的用于存放内联函数及所述被内联函数的地址,
所述补丁文件为所述服务端设备将所述内联函数与所述被内联函数进行函数内联,以生成第三函数,并根据所述第三函数,生成等价于所述第三函数的等价代码段,且获取用于存放所述内联函数及所述被内联函数的地址,以及获取用于修复所述被内联函数的第一修复函数后,所述服务端设备根据所述地址,将所述等价代码段中的所述被内联函数替换为所述第一修复函数生成的;
第二处理单元,用于根据所述地址及所述补丁文件修复所述被内联函数。
在第四方面的第一种可能的实现方式中,
所述第二处理单元,具体用于根据所述地址,将所述被内联函数的代码修改为跳转指令,所述跳转指令用于指示所述补丁文件的起始地址,以及根据所述跳转指令,执行所述补丁文件,以修复所述被内联函数。
结合前述的第四方面或第四方面的第一种可能的实现方式,在第二种可能的实现方式中,所述等价代码段保存于ELF文件中。
本发明实施例提供一种补丁的生成方法、打补丁的方法及装置,通过将内联函数与被内联函数进行函数内联,以生成第三函数,并根据第三函数,生成等价于第三函数的等价代码段,且获取用于存放内联函数及被内联函数的地址,以及获取用于修复被内联函数的第一修复函数,从而根据上述地址,将等价代码段中的被内联函数替换为第一修复函数,以生成补丁文件,进而输出该地址及补丁文件至用户端设备,以使用户端设备根据该地址及补丁文件修复被内联函数。通过该方案,若需对应用程序中经过函数内联的被内联函数进行修复或更新,软件开发人员则可以只重新编写需要修复或更新的被内联函数即可,同时通过在编译过程中生成相应的等价代码段,从而实现对被内联函数的修复或更新,能够在函数内联优化与热补丁共存的同时,快速地修复经过函数内联的应用程序。
第五方面,本发明实施例还提供一种补丁的生成方法,应用于对内联函数打补丁的场景,包括:
保存用于与所述内联函数进行函数内联的被内联函数的函数体;
获取用于存放所述内联函数及所述被内联函数的地址;
获取用于修复所述内联函数的第二修复函数;
根据所述地址,将所述被内联函数的函数体与所述第二修复函数结合,以生成补丁文件;
输出所述地址及所述补丁文件至用户端设备,以使所述用户端设备根据所述地址及所述补丁文件修复所述内联函数。
在第五方面的第一种可能的实现方式中,所述根据所述地址,将所述被内联函数的函数体与所述第二修复函数结合,以生成补丁文件之前,所述方法还包括:
获取函数内联关系图,所述函数内联关系图用于指示所述被内联函数的函数内联关系;
根据所述函数内联关系图查找是否存在所述被内联函数的函数体;
若未查找到所述被内联函数的函数体,则加载所述被内联函数的函数体至本地内存中。
结合前述的第五方面或第五方面的第一种可能的实现方式,在第二种可能的实现方式中,所述被内联函数的函数体保存于ELF文件中。
第六方面,本发明实施例还提供一种打补丁的方法,应用于对内联函数打补丁的场景,包括:
接收来自服务端设备的地址及补丁文件,其中,所述地址为所述服务端设备获取的用于存放所述内联函数及被内联函数的地址,
所述补丁文件为所述服务端设备保存用于与所述内联函数进行函数内联的所述被内联函数的函数体,并获取用于存放所述内联函数及所述被内联函数的地址,以及获取用于修复所述内联函数的第二修复函数后,所述服务端设备根据所述地址,将所述被内联函数的函数体与所述第二修复函数结合生成的;
根据所述地址及所述补丁文件修复所述内联函数。
在第六方面的第一种可能的实现方式中,所述根据所述地址及所述补丁文件修复所述内联函数的方法具体包括:
根据所述地址,将所述内联函数的代码修改为跳转指令,所述跳转指令用于指示所述补丁文件的起始地址;
根据所述跳转指令,执行所述补丁文件,以修复所述内联函数。
结合前述的第六方面或第六方面的第一种可能的实现方式,在第二种可能的实现方式中,所述被内联函数的函数体保存于ELF文件中。
第七方面,本发明实施例还提供一种服务端设备,应用于对内联函数打补丁的场景,包括:
第一存储单元,用于保存用于与所述内联函数进行函数内联的被内联函数的函数体;
第一获取单元,用于获取用于存放所述内联函数及所述被内联函数的地址,以及获取用于修复所述内联函数的第二修复函数;
第一处理单元,用于根据所述地址,将所述被内联函数的函数体与所述第二修复函数结合,以生成补丁文件;
第一输出单元,用于输出所述地址及所述补丁文件至用户端设备,以使所述用户端设备根据所述地址及所述补丁文件修复所述内联函数。
在第七方面的第一种可能的实现方式中,
所述第一获取单元,还用于获取函数内联关系图,所述函数内联关系图用于指示所述被内联函数的函数内联关系;
所述第一处理单元,还用于根据所述函数内联关系图查找是否存在所述被内联函数的函数体,以及若未查找到所述被内联函数的函数体,则加载所述被内联函数的函数体至本地内存中。
结合前述的第七方面或第七方面的第一种可能的实现方式,在第二种可能的实现方式中,所述被内联函数的函数体保存于ELF文件中。
第八方面,本发明实施例还提供一种用户端设备,应用于对内联函数打补丁的场景,包括:
第二接收单元,用于接收来自服务端设备的地址及补丁文件,其中,所述地址为所述服务端设备获取的用于存放所述内联函数及被内联函数的地址,
所述补丁文件为所述服务端设备保存用于与所述内联函数进行函数内联的所述被内联函数的函数体,并获取用于存放所述内联函数及所述被内联函数的地址,以及获取用于修复所述内联函数的第二修复函数后,所述服务端设备根据所述地址,将所述被内联函数的函数体与所述第二修复函数结合生成的;
第二处理单元,用于根据所述地址及所述补丁文件修复所述内联函数。
在第八方面的第一种可能的实现方式中,
所述第二处理单元,具体用于根据所述地址,将所述内联函数的代码修改为跳转指令,所述跳转指令用于指示所述补丁文件的起始地址,以及根据所述跳转指令,执行所述补丁文件,以修复所述内联函数。
结合前述的第八方面或第八方面的第一种可能的实现方式,在第二种可能的实现方式中,所述被内联函数的函数体保存于ELF文件中。
本发明实施例提供一种补丁的生成方法、打补丁的方法及装置,通过保存用于与内联函数进行函数内联的被内联函数的函数体,并获取用于存放内联函数及被内联函数的地址,以及获取用于修复内联函数的第二修复函数,从而根据上述地址,将被内联函数的函数体与第二修复函数结合,以生成补丁文件,进而输出该地址及补丁文件至用户端设备,以使用户端设备根据该地址及补丁文件修复内联函数。通过该方案,若需对应用程序中经过函数内联的内联函数进行修复或更新,软件开发人员则可以只重新编写需要修复或更新的内联函数即可,同时通过在编译过程中保存被内联函数的函数体,从而实现对内联函数的修复或更新,能够在函数内联优化与热补丁共存的同时,快速地修复经过函数内联的应用程序。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的一种补丁的生成方法的流程图一;
图2为本发明实施例提供的一种打补丁的方法的流程图一;
图3为本发明实施例提供的一种补丁的生成方法的流程图二;
图4为本发明实施例提供的一种打补丁的方法的流程图二;
图5为本发明实施例提供的一种补丁的生成方法及打补丁的方法的流程图三;
图6为本发明实施例提供的一种打补丁的方法的原理示意图一;
图7为本发明实施例提供的一种补丁的生成方法及打补丁的方法的流程图四;
图8为本发明实施例提供的一种打补丁的方法的原理示意图二;
图9为本发明实施例提供的一种服务端设备的结构示意图一;
图10为本发明实施例提供的一种用户端设备的结构示意图一;
图11为本发明实施例提供的一种服务端设备的结构示意图二;
图12为本发明实施例提供的一种服务端设备的结构示意图三;
图13为本发明实施例提供的一种用户端设备的结构示意图二;
图14为本发明实施例提供的一种补丁的实现系统框图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本文中术语“和/或”,仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,本文中字符“/”,一般表示前后关联对象是一种“或”的关系。
为了方便理解本发明实施例,首先在此介绍本发明实施例描述中会引入的几个要素。
inline:函数内联,为将被调用函数集成到调用函数的内部,类似于宏展开。
ELF:可执行链接格式(ExecutableandLinkingFormat)。
实施例一
本发明实施例提供一种补丁的生成方法,应用于对被内联函数打补丁的场景,即对应于对被调用函数打补丁的过程,该方法涉及服务端设备,如图1所示,包括:
S101、服务端设备将内联函数与被内联函数进行函数内联,以生成第三函数。
其中,服务端设备是为用户端设备服务的,服务端设备服务的内容包括向用户端设备提供资源,保存用户端设备的数据等。本发明实施例中,服务端设备通过获取软件开发人员提供的,对某些函数进行修改后的函数后,生成对应于该修改后的函数的补丁文件,并向用户端设备提供该补丁文件,以使得用户端设备使用该补丁文件对该某些函数打补丁,即对该某些函数进行修复。
一个应用程序的源代码包括多个函数,若该应用程序出现漏洞或需要更新,则可以以函数为单位对该应用程序进行修复或更新,也就是说,可以通过修复相应的出现漏洞或需要更新的函数,进而修复该应用程序。
其中,“函数”为表示每个输入值对应唯一输出值的一种对应关系。在计算机领域内,函数的语句用于完成某些有意义的工作——通常是处理文本,控制输入或计算数值等。在编写程序代码时,软件开发人员通过在程序代码中引入函数名称和所需的参数,可使得系统在执行该程序代码时相应地执行(或称调用)该函数。
在对源代码进行编译的过程中,服务端设备往往会将源代码中的调用函数与被调用函数进行函数内联,即将被调用函数的函数体直接嵌入到调用函数的函数体中,以提高编译后代码的性能。
本发明实施例中,内联函数与被内联函数之间为函数调用的关系,且内联函数调用被内联函数,即被内联函数为被调用函数,内联函数为调用函数,这样,在编译源代码的过程中,服务端设备往往会将内联函数与被内联函数进行函数内联,即将被内联函数的函数体嵌入到内联函数的函数体中,以生成第三函数。
S102、服务端设备根据第三函数,生成等价于第三函数的等价代码段。
服务端设备在将内联函数与被内联函数进行函数内联时,服务端设备根据内联函数对被内联函数进行函数内联后的第三函数,生成等价于第三函数的等价代码段。
需要说明的是,等价代码段的原理为将内联函数对被内联函数进行函数内联后的第三函数逆向为内联函数对被内联函数进行函数调用的代码段。
例如,若内联函数为:
test()
{
func();
}
被内联函数为:
那么,将内联函数与被内联函数进行函数内联,即内联函数对被内联函数进行函数内联后所得的第三函数为:
需要说明的是,被内联函数中的“push%ebp;mov%esp,ebp;”语句为函数的入栈指令,“leave;ret;”语句为执行完被内联函数后的返回指令,由于内联函数对被内联函数进行了函数内联,即将被内联函数的函数体嵌入到内联函数的函数体内,因此,函数的入栈指令及返回指令均不再需要,而只需将被内联函数的函数体中的实现某种功能的语句嵌入内联函数的函数体内即可。
本发明实施例中,服务端设备生成的等价于第三函数的等价代码段为:
由于服务端设备执行该等价代码段的效果与执行第三函数的效果相同,因此,可以看出,上述等价代码段中,内联函数对与内联函数进行函数内联的被内联函数有一个直接的函数调用,从而,可通过将进行了函数内联后的第三函数逆向为进行函数内联之前的函数调用,以生成相应的等价代码段。
S103、服务端设备获取用于存放内联函数及被内联函数的地址。
在计算机领域内,所有的程序均是在内存中运行的,内存也被称为内存储器,其作用是用于暂时存放CPU(CentralProcessingUnit,中央处理器)中的运算数据,以及与硬盘等外部存储器交换的数据。只要计算机在运行中,CPU就会把需要运算的数据调到内存中进行运算,当运算完成后CPU再将结果传送出来,内存的运行也决定了计算机的稳定运行。
程序在内存中运行时,程序在内存中都有相应的存放地址,即物理地址,相应的,每个程序中的各个函数或代码段也有各自相应的存放地址,即程序中的各个函数或代码段均有各自对应的物理地址。
具体地,在编译源代码的过程中,服务端设备获取内存中用于存放内联函数及被内联函数的地址,即内联函数和被内联函数在内存中的物理地址,以确定内联函数及被内联函数在内存中所在的位置。
需要说明的是,本发明实施例不限制S102与S103的执行时间顺序,即本发明的实施例可以先执行S102后执行S103,也可以先执行S103后执行S102,还可以同时执行S102与S103。
S104、服务端设备获取用于修复被内联函数的第一修复函数。
若需修复被内联函数,即需修复被调用函数,服务端设备则需首先获取用于修复被内联函数的第一修复函数。
需要说明的是,第一修复函数为软件开发人员根据被内联函数及被内联函数的问题或漏洞重新编写的用于替补被内联函数的函数。例如,若被内联函数中的某个语句出错,软件开发人员则需根据被内联函数及被内联函数中的该语句重新编写一个包括对该语句进行修改后的正确语句的第一修复函数,以用来对被内联函数进行修复。
S105、服务端设备根据该地址,将等价代码段中的被内联函数替换为第一修复函数,以生成补丁文件。
服务端设备根据内联函数及被内联函数的存放地址,将等价代码段中的被内联函数替换为第一修复函数,以生成相应的补丁文件。
S106、服务端设备输出该地址及补丁文件至用户端设备,以使用户端设备根据该地址及补丁文件修复被内联函数。
用户端设备也称为客户端设备,它与服务端设备相对应,用来接收服务端设备的信息,且为用户提供相应的服务。
服务端设备将用于存放应用程序中内联函数及被内联函数的地址,以及补丁文件进行压缩后形成压缩包,并将该压缩包输出至用户端设备,以使用户端设备可在不停止应用程序运行的情况下,根据该地址及补丁文件修复被内联函数,从而修复运行在用户端设备上的应用程序,进而实现对应用程序打热补丁的过程。
本发明实施例还提供一种打补丁的方法,应用于对被内联函数打补丁的场景,即对应于对被调用函数打补丁的过程,该方法涉及用户端设备,如图2所示,包括:
S201、用户端设备接收来自服务端设备的地址及补丁文件。
应用程序的源代码均是以函数为单位的,若运行在用户端设备的应用程序需要修复,则实际上是以函数为单位来进行修复的,也就是说,通过对出现漏洞或需要更新的函数进行修复,从而达到对该应用程序进行修复的目的。
示例性的,用户端设备接收来自服务端设备的地址及补丁文件,其中,该地址为服务端设备获取的用于存放内联函数及被内联函数的地址,即为内联函数及被内联函数在内存中的物理地址;补丁文件为服务端设备将内联函数与被内联函数进行函数内联,以生成第三函数,并根据第三函数,生成等价于第三函数的等价代码段,且获取用于存放内联函数及被内联函数的地址,以及获取用于修复被内联函数的第一修复函数后,服务端设备根据该地址,将等价代码段中的被内联函数替换为第一修复函数生成的。
S202、用户端设备根据该地址及补丁文件修复被内联函数。
用户端设备接收到来自服务端设备的该地址及补丁文件的压缩包后,首先解压该压缩包,然后,用户端设备可在不停止应用程序运行的情况下,根据该地址及补丁文件修复被内联函数,从而修复运行在用户端设备的应用程序,即实现对应用程序打热补丁的过程。
本发明实施例提供一种补丁的生成方法及打补丁的方法,通过将内联函数与被内联函数进行函数内联,以生成第三函数,并根据第三函数,生成等价于第三函数的等价代码段,且获取用于存放内联函数及被内联函数的地址,以及获取用于修复被内联函数的第一修复函数,从而根据该地址,将等价代码段中的被内联函数替换为第一修复函数,以生成补丁文件,进而输出该地址及补丁文件至用户端设备,以使用户端设备根据该地址及补丁文件修复被内联函数。通过该方案,若需对应用程序中经过函数内联的被内联函数进行修复或更新,软件开发人员则可以只重新编写需要修复或更新的被内联函数,同时通过在编译过程中生成相应的等价代码段,从而实现对被内联函数的修复或更新,能够在函数内联优化与热补丁共存的同时,快速地修复经过函数内联的应用程序。
本发明实施例还提供一种补丁的生成方法,应用于对内联函数打补丁的场景,即对应于对调用函数打补丁的过程,涉及服务端设备,如图3所示,包括:
S301、服务端设备保存用于与内联函数进行函数内联的被内联函数的函数体。
在对源代码进行编译的过程中,服务端设备往往会将源代码中的某些调用函数与被调用函数进行函数内联,即将被调用函数的函数体直接嵌入到调用函数的函数体中,以提高编译后代码的性能,然而,在将调用函数与被调用函数进行函数内联时,服务端设备并没有保留被内联函数(被调用函数)的过多信息,即服务端设备在将两个函数进行函数内联后,可能会将被内联函数的函数体删除,以节省存储空间。
在对源代码编译时,也就是在内联函数对被内联函数进行函数内联后,由于被内联函数的函数体已经嵌入了内联函数的函数体内,因此,服务端设备可能会删除被内联函数的函数体。本发明实施例中,在对源代码进行编译时,服务端设备则会保存用于与内联函数进行函数内联的被内联函数的函数体。
本领域普通技术人员可以理解,若被内联函数为:
则被内联函数的函数体为:
S302、服务端设备获取用于存放内联函数及被内联函数的地址。
在编译源代码的过程中,服务端设备获取内存中用于存放内联函数及被内联函数的地址,即内联函数和被内联函数在内存中的物理地址,以用来确定内联函数及被内联函数在内存中所在的位置。
需要说明的是,本发明实施例不限制S301与S302的执行时间顺序,即本发明的实施例可以先执行S301后执行S302,也可以先执行S302后执行S301,还可以同时执行S301与S302。
S303、服务端设备获取用于修复内联函数的第二修复函数。
若需修复内联函数,也就是调用函数,服务端设备则首先需获取用于修复内联函数的第二修复函数。
需要说明的是,第二修复函数为软件开发人员根据内联函数及内联函数的问题或漏洞重新编写的用于替补内联函数的一个函数。例如,若内联函数中的某个语句出错,软件开发人员则需根据内联函数及内联函数中的该语句重新编写一个包括对该语句进行修改后的正确语句的第二修复函数,以用来对内联函数进行修复。
S304、服务端设备根据该地址,将被内联函数的函数体与第二修复函数结合,以生成补丁文件。
服务端设备根据内联函数及被内联函数的存放地址,将被内联函数的函数体与第二修复函数相结合,以生成相应的补丁文件。
S305、服务端设备输出该地址及补丁文件至用户端设备,以使用户端设备根据该地址及补丁文件修复内联函数。
服务端设备将用于存放应用程序中内联函数及被内联函数的地址,以及补丁文件进行压缩后形成压缩包,并将该压缩包输出至用户端设备,以使用户端设备可在不停止应用程序运行的情况下,根据该地址及补丁文件修复内联函数,从而修复运行在用户端设备上的应用程序,即实现对应用程序打热补丁的过程。
本发明实施例还提供一种打补丁的方法,应用于对内联函数打补丁的场景,即对应于对调用函数打补丁的过程,该方法涉及用户端设备,如图4所示,包括:
S401、用户端设备接收来自服务端设备的地址及补丁文件。
示例性的,用户端设备接收来自服务端设备的地址及补丁文件,其中,该地址为服务端设备获取的用于存放内联函数及被内联函数的地址,即为内联函数及被内联函数在内存中的物理地址;补丁文件为服务端设备保存用于与内联函数进行函数内联的被内联函数的函数体,并获取用于存放内联函数及被内联函数的地址,以及获取用于修复内联函数的第二修复函数后,服务端设备根据该地址,将被内联函数的函数体与第二修复函数结合生成的。
S402、用户端设备根据该地址及补丁文件修复内联函数。
用户端设备接收到来自服务端设备的该地址及补丁文件的压缩包后,首先解压该压缩包,然后,用户端设备可在不停止应用程序运行的情况下,根据该地址及补丁文件修复内联函数,从而修复运行在用户端设备的应用程序,即实现对应用程序打热补丁的过程。
本发明实施例提供一种补丁的生成方法及打补丁的方法,通过保存用于与内联函数进行函数内联的被内联函数的函数体,并获取用于存放内联函数及被内联函数的地址,以及获取用于修复内联函数的第二修复函数,从而根据该地址,将被内联函数的函数体与第二修复函数结合,以生成补丁文件,进而输出该地址及补丁文件至用户端设备,以使用户端设备根据该地址及补丁文件修复内联函数。通过该方案,若需对应用程序中经过函数内联的内联函数进行修复或更新,软件开发人员则可以只重新编写需要修复或更新的内联函数,同时通过在编译过程中保存被内联函数的函数体,从而实现对内联函数的修复或更新,能够在函数内联优化与热补丁共存的同时,快速地修复经过函数内联的应用程序。。
实施例二
本发明实施例提供一种补丁的生成方法及打补丁的方法,应用于对被内联函数打补丁的场景,即对应于对被调用函数打补丁的过程,如图5所示,包括:
S501、在编译过程中,服务端设备将内联函数与被内联函数进行函数内联,以生成第三函数。
服务端设备是为用户端设备服务的,服务的内容诸如向用户端设备提供资源,保存用户端设备的数据等。本发明实施例中的服务端设备通过获取软件开发人员提供的对某些函数进行修改后的函数,生成对应于该修改后的函数的补丁文件,并向用户端设备提供该补丁文件,以用来修复该某些函数,即对该某些函数打补丁。
一个应用程序的源代码包括多个函数,若该应用程序出现漏洞或需要更新,则可以以函数为单位来对该应用程序进行修复或更新,也就是说,可以通过修复相应的出现漏洞或需要更新的函数,进而修复该应用程序。
其中,“函数”为表示每个输入值对应唯一输出值的一种对应关系。在计算机领域内,函数的语句用于完成某些有意义的工作——通常是处理文本,控制输入或计算数值等。在编写程序代码时,软件开发人员通过在程序代码中引入函数名称和所需的参数,可使得系统在执行该程序代码时相应地执行(或称调用)该函数。
在对源代码进行编译的过程中,服务端设备往往会将源代码中的调用函数与被调用函数进行函数内联,即将被调用函数的函数体直接嵌入到调用函数的函数体中,以提高编译后代码的性能。
本发明实施例中,内联函数与被内联函数之间为函数调用的关系,且内联函数调用被内联函数,即被内联函数为被调用函数,内联函数为调用函数,这样,在编译源代码的过程中,服务端设备往往会将内联函数与被内联函数进行函数内联,以生成第三函数。
S502、服务端设备根据第三函数,确定内联函数对被内联函数进行函数调用的调用关系。
函数调用为计算机编程或运行时,使用某个函数来完成相关的命令。在程序中,通过对函数的调用来执行被调用函数的函数体,从而实现相应的功能。
由于第三函数为内联函数对被内联函数进行函数内联后的函数,因此,服务端设备可根据第三函数,确定内联函数与被内联函数之间的函数调用关系,即确定内联函数对被内联函数进行函数调用的调用关系。
S503、服务端设备根据调用关系,生成等价于第三函数的等价代码段。
服务端设备确定了内联函数与被内联函数之间的函数调用关系后,服务端设备根据该调用关系,生成等价于第三函数的等价代码段。
特别的,等价代码段可以保存于ELF文件中,也可以保存于其他任意满足要求的文件中,本发明不做限制。
需要说明的是,等价代码段的原理为将内联函数对被内联函数进行函数内联后的第三函数逆向为内联函数对被内联函数进行函数调用的代码段。
例如,若内联函数为:
test()
{
func();
}
被内联函数为:
那么,将内联函数与被内联函数进行函数内联,即内联函数对被内联函数进行函数内联后所得的第三函数为:
需要说明的是,被内联函数中的“push%ebp;mov%esp,ebp;”语句为函数的入栈指令,“leave;ret;”语句为执行完被内联函数后的返回指令,由于内联函数对被内联函数进行了函数内联,即将被内联函数的函数体嵌入到内联函数的函数体内,因此,函数的入栈指令及返回指令均不再需要,而只需将被内联函数的函数体中的实现某种功能的语句嵌入内联函数的函数体内即可。
本发明实施例中,服务端设备生成的等价于第三函数的等价代码段为:
由于服务端设备执行该等价代码段的效果与执行第三函数的效果是相同的,因此,可以看出,上述等价代码段中,内联函数对与内联函数进行函数内联的被内联函数有一个直接的函数调用,从而,可通过将进行了函数内联后的第三函数逆向为进行函数内联之前的函数调用,以生成相应的等价代码段。
S504、服务端设备获取用于存放内联函数及被内联函数的地址。
在计算机领域内,所有的程序均是在内存中运行的,内存也被称为内存储器,其作用是用于暂时存放CPU(CentralProcessingUnit,中央处理器)中的运算数据,以及与硬盘等外部存储器交换的数据。只要计算机在运行中,CPU就会把需要运算的数据调到内存中进行运算,当运算完成后CPU再将结果传送出来,内存的运行也决定了计算机的稳定运行。
程序在内存中运行时,程序在内存中都有相应的存放地址,即物理地址,相应的,每个程序中的各个函数或代码段也有各自相应的存放地址,即程序中的各个函数或代码段均有各自对应的物理地址。
在编译源代码的过程中,服务端设备获取内存中用于存放内联函数及被内联函数的地址,即内联函数和被内联函数在内存中的物理地址,以用来确定内联函数及被内联函数在内存中所在的位置。
需要说明的是,本发明实施例不限制S502-S503与S504的执行时间顺序,即本发明的实施例可以先执行S502-S503后执行S504,也可以先执行S504后执行S502-S503,还可以同时执行S502-S503与S504。
S505、服务端设备获取用于修复被内联函数的第一修复函数。
若需修复被内联函数,即被调用函数,服务端设备则需首先获取用于修复被内联函数的第一修复函数。
需要说明的是,第一修复函数为软件开发人员根据被内联函数及被内联函数的问题或漏洞重新编写的用于替补被内联函数的函数。例如,若被内联函数中的某个语句出错,软件开发人员则需根据被内联函数及被内联函数中的该语句重新编写一个包括对该语句进行修改后的正确语句的第一修复函数,以用来修复被内联函数。
S506、服务端设备根据该地址,将等价代码段中的被内联函数替换为第一修复函数,以生成补丁文件。
服务端设备根据内联函数及被内联函数的存放地址,将等价代码段中的被内联函数替换为第一修复函数,以生成相应的补丁文件。
S507、服务端设备输出该地址及补丁文件至用户端设备。
用户端设备也称为客户端,它与服务端设备相对应,用来接收服务端设备的信息,且为用户提供相应的服务。
服务端设备将用于存放应用程序中内联函数及被内联函数的地址,以及补丁文件进行压缩后形成压缩包,并将该压缩包输出至用户端设备,以使用户端设备可根据该地址及补丁文件修复被内联函数。
S508、用户端设备根据该地址,将被内联函数的代码修改为跳转指令。
用户端设备接收到来自服务端设备的压缩包后,首先解压该压缩包,然后,用户端设备根据该压缩包中的用于存放内联函数及被内联函数的地址,将运行于用户端设备的应用程序中的被内联函数的代码修改为一条跳转指令jmp,如:
test()
{
jmp;
}
S509、用户端设备根据跳转指令,执行补丁文件,以修复被内联函数。
应用程序的源代码均是以函数为单位的,若运行在用户端设备的应用程序需要修复或更新,则实际上是以函数为单位来进行修复或更新的,也就是说,通过对出现漏洞或需要更新的函数进行修复,从而达到对该应用程序进行修复的目的。
示例性的,如图6所示,若需对运行在用户端设备的应用程序中的被内联函数打补丁,则当用户端设备执行至被内联函数时,用户端设备则根据被内联函数处的跳转指令跳转至等价代码段的开始处开始执行,在执行等价代码段的过程中,根据等价代码段中的调用指令“callfunc”转去执行用于修复被内联函数的第一修复函数,执行完第一修复函数后,再返回至等价代码段中的调用指令后,通过执行等价代码段中的跳转指令再返回至被内联函数处,继续执行被内联函数处的跳转指令后的其他指令,进而继续运行该应用程序。
这样,用户端设备可在不停止应用程序运行的情况下,根据该地址及相应的补丁文件对被内联函数进行修复,从而修复运行在用户端设备的应用程序,即实现对应用程序打热补丁的过程。
本发明实施例提供一种补丁的生成方法及打补丁的方法,通过将内联函数与被内联函数进行函数内联,以生成第三函数,并根据第三函数,生成等价于第三函数的等价代码段,且获取用于存放内联函数及被内联函数的地址,以及获取用于修复被内联函数的第一修复函数,从而根据该地址,将等价代码段中的被内联函数替换为第一修复函数,以生成补丁文件,进而输出该地址及补丁文件至用户端设备,以使用户端设备根据该地址及补丁文件修复被内联函数。通过该方案,若需对应用程序中经过函数内联的被内联函数进行修复或更新,软件开发人员则可以只重新编写需要修复或更新的被内联函数,同时通过在编译过程中生成相应的等价代码段,从而实现对被内联函数的修复或更新,能够在函数内联优化与热补丁共存的同时,快速地修复经过函数内联的应用程序。
本发明实施例还提供一种补丁的生成方法及打补丁的方法,应用于对内联函数打补丁的场景,即对应于对调用函数打补丁的过程,如图7所示,包括:
S601、在编译过程中,服务端设备保存用于与内联函数进行函数内联的被内联函数的函数体。
在对源代码进行编译过程中,服务端设备往往会将源代码中的调用函数与被调用函数进行函数内联,即将被调用函数的函数体直接嵌入到调用函数的函数体中,以提高编译后代码的性能,然而,在将调用函数与被调用函数进行函数内联时,服务端设备并没有保留被内联函数(也就是被调用函数)的太多信息,即服务端设备在将两个函数进行函数内联后,可能会将被内联函数的函数体删除,以用来节省存储空间。
本发明实施例中,内联函数与被内联函数之间为函数调用的关系,且内联函数调用被内联函数,即被内联函数为被调用函数,内联函数为调用函数,这样,在编译源代码的过程中,服务端设备往往会将内联函数与被内联函数进行函数内联。
在对源代码进行编译时,也就是在内联函数对被内联函数进行函数内联后,由于被内联函数的函数体已经嵌入了内联函数的函数体内,因此,服务端设备可能会删除被内联函数的函数体。本发明实施例中,在对源代码进行编译时,服务端设备首先保存用于与内联函数进行函数内联的被内联函数的函数体。
特别的,被内联函数的函数体可以保存于ELF文件中,也可以保存于其他任意满足要求的文件中,本发明不做限制。
需要说明的是,上述对被内联函数打补丁时生成的等价代码段与对内联函数打补丁时保存的被内联函数的函数体,可以同时存放在ELF文件的一个段中,也可以分别存在于ELF文件的不同段中,本发明不做限制。
本领域普通技术人员可以理解,若被内联函数为:
则被内联函数的函数体为:
S602、服务端设备获取用于存放内联函数及被内联函数的地址。
在编译源代码的过程中,服务端设备获取内存中用于存放内联函数及被内联函数的地址,即内联函数和被内联函数在内存中的物理地址,以用来确定内联函数及被内联函数在内存中所在的位置。
需要说明的是,本发明实施例不限制S601与S602的执行时间顺序,即本发明的实施例可以先执行S601后执行S602,也可以先执行S602后执行S601,还可以同时执行S601与S602。
S603、服务端设备获取用于修复内联函数的第二修复函数。
若需修复内联函数,也就是调用函数,服务端设备则首先需获取用于修复内联函数的第二修复函数。
需要说明的是,第二修复函数为软件开发人员根据内联函数及内联函数的问题或漏洞重新编写的用于替补内联函数的一个函数。例如,若内联函数中的某个语句出错,软件开发人员则需根据内联函数及内联函数中的该语句重新编写一个包括对该语句进行修改后的正确语句的第二修复函数,以用来对内联函数进行修复。
S604、服务端设备获取函数内联关系图,函数内联关系图用于指示被内联函数的函数内联关系。
服务端设备获取源代码编译过程中生成的内联关系图,内联关系图为用于指示被内联函数的函数内联关系,也就是被内联函数与其他函数之间的函数内联关系。
需要说明的是,本发明实施例不限制S603与S604的执行时间顺序,即本发明的实施例可以先执行S603后执行S604,也可以先执行S604后执行S603,还可以同时执行S603与S604。
S605、服务端设备根据函数内联关系图查找是否存在被内联函数的函数体。
服务端设备根据被内联函数的函数内联关系,在服务端设备的整个系统中查找是否存在被内联函数的函数体。
需要说明的是,服务端设备在将内联函数与被内联函数进行函数内联后,若被内联函数未被其他函数或其他数据库调用,则服务端设备会删除被内联函数的函数体。
S606、若未查找到被内联函数的函数体,服务端设备则加载被内联函数的函数体至本地内存中。
若服务端设备在整个系统中未查找到被内联函数的函数体,服务端设备则加载S601中保存的被内联函数的函数体至本地内存中。
当然,若服务端设备在整个系统中查找到了被内联函数的函数体,服务端设备则可根据该被内联函数的函数体所在的地址直接调用该被内联函数。
S607、服务端设备根据该地址,将被内联函数的函数体与第二修复函数结合,以生成补丁文件。
服务端设备根据内联函数及被内联函数的存放地址,将被内联函数的函数体与第二修复函数相结合,以生成相应的补丁文件。
S608、服务端设备输出该地址及补丁文件至用户端设备。
服务端设备将用于存放应用程序中内联函数及被内联函数的地址,以及补丁文件进行压缩后形成压缩包,并将该压缩包输出至用户端设备,以使用户端设备可根据该地址及补丁文件修复内联函数。
S609、用户端设备根据该地址,将内联函数的代码修改为跳转指令。
用户端设备接收到来自服务端设备的压缩包后,首先解压该压缩包,然后,用户端设备根据该压缩包中的用于存放内联函数及被内联函数的地址,将运行于用户端设备的应用程序中的内联函数的代码修改为一条跳转指令jmp,如:
test()
{
jmp;
}
S610、用户端设备根据跳转指令,执行补丁文件,以修复内联函数。
示例性的,如图8所示,若需对运行在用户端设备的应用程序中的内联函数打补丁,则当用户端设备执行至内联函数时,用户端设备则根据内联函数处的跳转指令跳转至用于修复内联函数的第二修复函数的开始处开始执行,在执行第二修复函数的过程中,根据第二修复函数中的调用指令“callfunc”转去执行被内联函数的函数体,执行完被内联函数的函数体后,再返回至第二修复函数中,通过执行第二修复函数中的跳转指令再返回至内联函数处,继续执行内联函数处的跳转指令后的其他指令,进而继续运行该应用程序。
这样,用户端设备可在不停止应用程序运行的情况下,根据该地址及相应的补丁文件修复内联函数,从而修复运行在用户端设备的应用程序,即实现对应用程序打热补丁的过程。
本发明实施例提供一种补丁的生成方法及打补丁的方法,通过保存用于与内联函数进行函数内联的被内联函数的函数体,并获取用于存放内联函数及被内联函数的地址,以及获取用于修复内联函数的第二修复函数,从而根据上述地址,将被内联函数的函数体与第二修复函数结合,以生成补丁文件,进而输出该地址及补丁文件至用户端设备,以使用户端设备根据该地址及补丁文件修复内联函数。通过该方案,若需对应用程序中经过函数内联的内联函数进行修复或更新,软件开发人员则可以只重新编写需要修复或更新的内联函数,同时通过在编译过程中保存被内联函数的函数体,从而实现对内联函数的修复或更新,能够在函数内联优化与热补丁共存的同时,快速地修复经过函数内联的应用程序。
实施例三
如图9所示,本发明实施例提供一种服务端设备1,应用于对被内联函数打补丁的场景,即对应于对被调用函数打补丁的方法,包括:
第一处理单元10,用于根据将内联函数与被内联函数进行函数内联,以生成第三函数,并根据所述第三函数,生成等价于所述第三函数的等价代码段。
第一获取单元11,用于获取用于存放所述内联函数及所述被内联函数的地址,以及获取用于修复所述被内联函数的第一修复函数。
所述第一处理单元10,还用于根据所述地址,将所述等价代码段中的所述被内联函数替换为所述第一修复函数,以生成补丁文件。
第一输出单元12,用于输出所述地址及所述补丁文件至用户端设备,以使所述用户端设备根据所述地址及所述补丁文件修复所述被内联函数。
进一步地,所述第一处理单元10,具体用于根据所述第三函数,确定所述内联函数对所述被内联函数进行函数调用的调用关系,以及根据所述调用关系,生成所述等价代码段。
进一步地,所述等价代码段可以保存于ELF文件中。
需要说明的是,等价代码段可以保存于ELF文件中,也可以保存于其他任意满足要求的文件中,本发明不做限制。
如图10所示,本发明实施例提供一种用户端设备2,应用于对被内联函数打补丁的场景,即对应于对被调用函数打补丁的方法,包括:
第二接收单元20,用于接收来自服务端设备的地址及补丁文件,其中,所述地址为所述服务端设备获取的用于存放内联函数及所述被内联函数的地址,
所述补丁文件为所述服务端设备将所述内联函数与所述被内联函数进行函数内联,以生成第三函数,并根据所述第三函数,生成等价于所述第三函数的等价代码段,且获取用于存放所述内联函数及所述被内联函数的地址,以及获取用于修复所述被内联函数的第一修复函数后,所述服务端设备根据所述地址,将所述等价代码段中的所述被内联函数替换为所述第一修复函数生成的。
第二处理单元21,用于根据所述地址及所述补丁文件修复所述被内联函数。
进一步地,所述第二处理单元21,具体用于根据所述地址,将所述被内联函数的代码修改为跳转指令,所述跳转指令用于指示所述补丁文件的起始地址,以及根据所述跳转指令,执行所述补丁文件,以修复所述被内联函数。
进一步地,所述等价代码段可以保存于ELF文件中。
本发明实施例提供一种服务端设备及用户端设备,服务端设备将内联函数与被内联函数进行函数内联,以生成第三函数,并根据第三函数,生成等价于第三函数的等价代码段,且获取用于存放内联函数及被内联函数的地址,以及获取用于修复被内联函数的第一修复函数后,从而服务端设备根据上述地址,将等价代码段中的被内联函数替换为第一修复函数,以生成补丁文件,进而输出该地址及补丁文件至用户端设备,以使用户端设备根据该地址及补丁文件修复被内联函数。通过该方案,若需对应用程序中经过函数内联的被内联函数进行修复或更新,软件开发人员则可以只重新编写需要修复或更新的被内联函数,同时通过在编译过程中生成相应的等价代码段,从而实现对被内联函数的修复或更新,能够在函数内联优化与热补丁共存的同时,快速地修复经过函数内联的应用程序。
如图11所示,本发明实施例提供一种服务端设备1,应用于对内联函数打补丁的场景,即对应于对调用函数打补丁的方法,包括:
第一存储单元13,用于保存用于与所述内联函数进行函数内联的被内联函数的函数体。
第一获取单元11,用于获取用于存放所述内联函数及所述被内联函数的地址,以及获取用于修复所述内联函数的第二修复函数。
第一处理单元10,用于根据所述地址,将所述被内联函数的函数体与所述第二修复函数结合,以生成补丁文件。
第一输出单元12,用于输出所述地址及所述补丁文件至用户端设备,以使所述用户端设备根据所述地址及所述补丁文件修复所述内联函数。
进一步地,所述第一获取单元11,还用于获取函数内联关系图,所述函数内联关系图用于指示所述被内联函数的函数内联关系。
所述第一处理单元10,还用于根据所述函数内联关系图查找是否存在所述被内联函数的函数体,以及若未查找到所述被内联函数的函数体,则加载所述被内联函数的函数体至本地内存中。
进一步地,所述被内联函数的函数体可以保存于ELF文件中。
需要说明的是,被内联函数的函数体可以保存于ELF文件中,也可以保存于其他任意满足要求的文件中,本发明不做限制。
如图10所示,本发明实施例提供一种用户端设备2,应用于对内联函数打补丁的场景,即对应于对调用函数打补丁的方法,包括:
第二接收单元20,用于接收来自服务端设备的地址及补丁文件,其中,所述地址为所述服务端设备获取的用于存放所述内联函数及被内联函数的地址,
所述补丁文件为所述服务端设备保存用于与所述内联函数进行函数内联的所述被内联函数的函数体,并获取用于存放所述内联函数及所述被内联函数的地址,以及获取用于修复所述内联函数的第二修复函数后,所述服务端设备根据所述地址,将所述被内联函数的函数体与所述第二修复函数结合生成的。
第二处理单元21,用于根据所述地址及所述补丁文件修复所述内联函数。
进一步地,所述第二处理单元21,具体用于根据所述地址,将所述内联函数的代码修改为跳转指令,所述跳转指令用于指示所述补丁文件的起始地址,以及根据所述跳转指令,执行所述补丁文件,以修复所述内联函数。
进一步地,所述被内联函数的函数体可以保存于ELF文件中。
本发明实施例提供一种服务端设备及用户端设备,服务端设备保存用于与内联函数进行函数内联的被内联函数的函数体,并获取用于存放内联函数及被内联函数的地址,以及获取用于修复内联函数的第二修复函数后,从而服务端设备根据上述地址,将被内联函数的函数体与第二修复函数结合,以生成补丁文件,进而输出该地址及补丁文件至用户端设备,以使用户端设备根据该地址及补丁文件修复内联函数。通过该方案,若需对应用程序中经过函数内联的内联函数进行修复或更新,软件开发人员则可以只重新编写需要修复或更新的内联函数,同时通过在编译过程中保存被内联函数的函数体,从而实现对内联函数的修复或更新,能够在函数内联优化与热补丁共存的同时,快速地修复经过函数内联的应用程序。
实施例四
如图12所示,本发明实施例提供一种服务端设备1,应用于对被内联函数打补丁的场景,即对应于对被调用函数打补丁的方法,该服务端设备1包括:至少一个第一处理器14,例如CPU,至少一个第一网络接口16或者其他第一用户接口17,第一存储器15,至少一个第一通信总线18。第一通信总线18用于实现这些组件之间的连接通信。该服务端设备1可选的包含其他第一用户接口17,包括显示器,键盘或者点击设备(例如,鼠标,轨迹球(trackball),触感板或者触感显示屏)。第一存储器15可能包含高速RAM(RandomAccessMemory,随机存取存储器),也可能还包括非不稳定的存储器(non-volatilememory),例如至少一个磁盘存储器。第一存储器15可选的可以包含至少一个位于远离前述第一处理器14的存储装置。
在一些实施方式中,第一存储器15存储了如下的元素,可执行模块或者数据结构,或者他们的子集,或者他们的扩展集:
第一操作系统150,包含各种系统程序,用于实现各种基础业务以及处理基于硬件的任务。
第一应用模块151,包含各种应用程序,用于实现各种应用业务。
第一应用模块151中包括但不限于编译器1510和补丁制作客户端1511。
第一应用模块151中各模块的具体实现参见图14所示实施例中的相应模块,在此不赘述。
具体的,首先,第一处理器14用于根据将内联函数与被内联函数进行函数内联,以生成第三函数,并根据所述第三函数,生成等价于所述第三函数的等价代码段,以及将等价代码段保存至第一存储器15中。
然后,第一处理器14获取用于存放内联函数及被内联函数的地址,以及获取用于修复被内联函数的第一修复函数,并将该地址及第一修复函数通过第一通信总线18保存至第一存储器15中。
接着,第一处理器14根据存储在第一存储器15中的该地址,将等价代码段中的被内联函数替换为第一修复函数,以生成相应的补丁文件。
最后,第一处理器14在第一通信总线18上,通过第一网络接口16或第一用户接口17输出该地址及补丁文件至用户端设备,以使用户端设备根据该地址及补丁文件修复被内联函数。
进一步地,第一处理器14,具体用于根据第三函数,确定内联函数对被内联函数进行函数调用的调用关系,以及根据该调用关系,生成相应的等价于第三函数的等价代码段。
进一步地,等价代码段可以保存于ELF文件中。
需要说明的是,等价代码段可以保存于ELF文件中,也可以保存于其他任意满足要求的文件中,本发明不做限制。
如图13所示,本发明实施例提供一种用户端设备2,应用于对被内联函数打补丁的场景,即对应于对被调用函数打补丁的方法,该用户端设备2包括:至少一个第二处理器22,例如CPU,至少一个第二网络接口24或者其他第二用户接口25,第二存储器23,至少一个第二通信总线26。第二通信总线26用于实现这些组件之间的连接通信。该用户端设备2可选的包含其他第二用户接口25,包括显示器,键盘或者点击设备(例如,鼠标,轨迹球(trackball),触感板或者触感显示屏)。第二存储器23可能包含高速RAM(RandomAccessMemory,随机存取存储器),也可能还包括非不稳定的存储器(non-volatilememory),例如至少一个磁盘存储器。第二存储器23可选的可以包含至少一个位于远离前述第二处理器22的存储装置。
在一些实施方式中,第二存储器23存储了如下的元素,可执行模块或者数据结构,或者他们的子集,或者他们的扩展集:
第二操作系统230,包含各种系统程序,用于实现各种基础业务以及处理基于硬件的任务。
第二应用模块231,包含各种应用程序,用于实现各种应用业务。
第二应用模块231中包括但不限于补丁管理客户端2310。
第二应用模块231中各模块的具体实现参见图14所示实施例中的相应模块,在此不赘述。
具体的,在打补丁过程中,首先,第二处理器22在第二通信总线26上,通过第二网络接口24或第二用户接口25接收到来自服务端设备的地址及补丁文件,并将该地址及补丁文件通过第二通信总线26保存至第二存储器23中,其中,该地址为服务端设备获取的用于存放内联函数及被内联函数的地址,补丁文件为服务端设备将内联函数与被内联函数进行函数内联,以生成第三函数,并根据第三函数,生成等价于第三函数的等价代码段,且获取用于存放内联函数及被内联函数的地址,以及获取用于修复被内联函数的第一修复函数后,服务端设备根据地址,将等价代码段中的被内联函数替换为第一修复函数生成的。
然后,第二处理器22通过第二通信总线26从第二存储器23内调出该地址及补丁文件,以根据该地址及补丁文件修复被内联函数。
进一步地,第二处理器22,具体用于根据该地址,将被内联函数的代码修改为跳转指令,以及根据该跳转指令执行补丁文件,以修复被内联函数,其中,跳转指令用于指示补丁文件的起始地址。
进一步地,等价代码段可以保存于ELF文件中。
本发明实施例提供一种服务端设备及用户端设备,服务端设备将内联函数与被内联函数进行函数内联,以生成第三函数,并根据第三函数,生成等价于第三函数的等价代码段,且获取用于存放内联函数及被内联函数的地址,以及获取用于修复被内联函数的第一修复函数后,从而服务端设备根据上述地址,将等价代码段中的被内联函数替换为第一修复函数,以生成补丁文件,进而输出该地址及补丁文件至用户端设备,以使用户端设备根据该地址及补丁文件修复被内联函数。通过该方案,若需对应用程序中经过函数内联的被内联函数进行修复或更新,软件开发人员则可以只重新编写需要修复或更新的被内联函数,同时通过在编译过程中生成相应的等价代码段,从而实现对被内联函数的修复或更新,能够在函数内联优化与热补丁共存的同时,快速地修复经过函数内联的应用程序。
如图12所示,本发明实施例提供一种服务端设备1,应用于对内联函数打补丁的场景,即对应于对调用函数打补丁的方法,该服务端设备1包括:至少一个第一处理器14,例如CPU,至少一个第一网络接口16或者其他第一用户接口17,第一存储器15,至少一个第一通信总线18。第一通信总线18用于实现这些组件之间的连接通信。该服务端设备1可选的包含其他第一用户接口17,包括显示器,键盘或者点击设备(例如,鼠标,轨迹球(trackball),触感板或者触感显示屏)。第一存储器15可能包含高速RAM(RandomAccessMemory,随机存取存储器),也可能还包括非不稳定的存储器(non-volatilememory),例如至少一个磁盘存储器。第一存储器15可选的可以包含至少一个位于远离前述第一处理器14的存储装置。
在一些实施方式中,第一存储器15存储了如下的元素,可执行模块或者数据结构,或者他们的子集,或者他们的扩展集:
第一操作系统150,包含各种系统程序,用于实现各种基础业务以及处理基于硬件的任务。
第一应用模块151,包含各种应用程序,用于实现各种应用业务。
第一应用模块151中包括但不限于编译器1510和补丁制作客户端1511。
第一应用模块151中各模块的具体实现参见图14所示实施例中的相应模块,在此不赘述。
具体的,在编译过程中,首先,第一处理器14通过第一通信总线18将用于与内联函数进行函数内联的被内联函数的函数体保存至第一存储器15中。
然后,第一处理器14获取用于存放内联函数及被内联函数的地址,以及获取用于修复内联函数的第二修复函数,并将该地址及第二修复函数通过第一通信总线18保存至第一存储器15中。
接着,第一处理器14根据第一存储器15中存储的该地址,将被内联函数的函数体与第二修复函数结合,以生成相应的补丁文件。
最后,第一处理器14在第一通信总线18上,通过第一网络接口16或第一用户接口17输出该地址及补丁文件至用户端设备,以使用户端设备根据该地址及补丁文件修复内联函数。
进一步地,第一处理器14,还用于获取函数内联关系图,并将函数内联关系图通过第一通信总线18保存至第一存储器15中,以及调出第一存储器15中保存的函数内联关系图,并根据该函数内联关系图在服务端设备的整个系统中查找是否存在被内联函数的函数体,以及若未查找到被内联函数的函数体,第一处理器14则加载被内联函数的函数体至本地内存中,其中,函数内联关系图用于指示被内联函数的函数内联关系。
进一步地,被内联函数的函数体可以保存于ELF文件中。
需要说明的是,被内联函数的函数体可以保存于ELF文件中,也可以保存于其他任意满足要求的文件中,本发明不做限制。
如图13所示,本发明实施例提供一种用户端设备2,应用于对内联函数打补丁的场景,即对应于对调用函数打补丁的方法,该用户端设备2包括:至少一个第二处理器22,例如CPU,至少一个第二网络接口24或者其他第二用户接口25,第二存储器23,至少一个第二通信总线26。第二通信总线26用于实现这些组件之间的连接通信。该用户端设备2可选的包含其他第二用户接口25,包括显示器,键盘或者点击设备(例如,鼠标,轨迹球(trackball),触感板或者触感显示屏)。第二存储器23可能包含高速RAM(RandomAccessMemory,随机存取存储器),也可能还包括非不稳定的存储器(non-volatilememory),例如至少一个磁盘存储器。第二存储器23可选的可以包含至少一个位于远离前述第二处理器22的存储装置。
在一些实施方式中,第二存储器23存储了如下的元素,可执行模块或者数据结构,或者他们的子集,或者他们的扩展集:
第二操作系统230,包含各种系统程序,用于实现各种基础业务以及处理基于硬件的任务。
第二应用模块231,包含各种应用程序,用于实现各种应用业务。
第二应用模块231中包括但不限于补丁管理客户端2310。
第二应用模块231中各模块的具体实现参见图14所示实施例中的相应模块,在此不赘述。
具体的,在打补丁过程中,首先,第二处理器22在第二通信总线26上,通过第二网络接口24或第二用户接口25接收来自服务端设备的地址及补丁文件,并将该地址及补丁文件通过第二通信总线26保存至第二存储器23中,其中,该地址为服务端设备获取的用于存放内联函数及被内联函数的地址,补丁文件为服务端设备保存用于与内联函数进行函数内联的被内联函数的函数体,并获取用于存放内联函数及被内联函数的地址,以及获取用于修复内联函数的第二修复函数后,服务端设备根据该地址,将被内联函数的函数体与第二修复函数结合生成的。
然后,第二处理器22通过第二通信总线26从存储器23中调出该地址及补丁文件,并根据该地址及补丁文件修复内联函数。
进一步地,第二处理器22,具体用于通过第二通信总线26调出第二存储器23中保存的该地址,并根据该地址,将内联函数的代码修改为跳转指令,以及根据跳转指令,执行补丁文件,以修复内联函数,其中,跳转指令用于指示补丁文件的起始地址。
进一步地,被内联函数的函数体可以保存于ELF文件中。
本发明实施例提供一种服务端设备及用户端设备,服务端设备保存用于与内联函数进行函数内联的被内联函数的函数体,并获取用于存放内联函数及被内联函数的地址,以及获取用于修复内联函数的第二修复函数后,从而服务端设备根据上述地址,将被内联函数的函数体与第二修复函数结合,以生成补丁文件,进而输出该地址及补丁文件至用户端设备,以使用户端设备根据该地址及补丁文件修复内联函数。通过该方案,若需对应用程序中经过函数内联的内联函数进行修复或更新,软件开发人员则可以只重新编写需要修复或更新的内联函数,同时通过在编译过程中保存被内联函数的函数体,从而实现对内联函数的修复或更新,能够在函数内联优化与热补丁共存的同时,快速地修复经过函数内联的应用程序。
实施例五
上述实施例提供的一种补丁的生成方法、打补丁的方法及装置,均是从硬件执行角度来进行说明的,下面再从软件执行角度,结合本发明实施例提供的一种补丁的生成方法及打补丁的方法,以及运行在本发明实施例提供的服务端设备和用户端设备上的客户端,对本发明实施例提供的补丁的实现系统进行详细地说明。
本领域普通技术人员可以理解,本发明实施例提供的一种补丁的生成方法及打补丁的方法,需通过硬件装置执行相应的软件程序及指令才能实现。
如图14所示,本发明实施例提供的一种补丁的实现系统3,包括编译器1510、补丁制作客户端1511以及补丁管理客户端2310,其中,编译器1510、补丁制作客户端1511对应于本发明实施例提供的服务端设备1,补丁管理客户端2310对应于本发明实施例提供的用户端设备2,应当理解的是,编译器1510和补丁制作客户端1511均运行在服务端设备1,补丁管理客户端2310运行在用户端设备2。需要说明的是,图14所示的系统中示意性的包括一个用户端设备,应当理解的是,本发明实施例的系统可以包括一个或多个用户端设备。
编译器为可以将“高级语言”翻译为“机器语言(低级语言)”的一个应用程序。一个现代编译器的主要工作流程为:源代码(sourcecode)→预处理器(preprocessor)→编译器(compiler)→汇编程序(assembler)→目标代码(objectcode)→链接器(Linker)→可执行程序(executables),即软件开发人员编写的源代码,经过编译器的一系列处理,最终经过编译链接后生成可执行程序,以供计算机执行。
本发明实施例提供的一种补丁的实现系统3可应用于通信网络中,优选的,可应用于通信网络中业务不能中断的设备中运行的应用程序的修复。具体的,以通信网络中的路由器为例,若路由器传输的数据格式进行了调整、路由器对传输数据的统计不精确或者路由器的内存不能正常释放,则为了兼容新的数据格式、对数据统计的更精确或者使得路由器的内存可以正常释放,需对路由器的相关应用程序(假设应用程序中存在函数内联的情况)进行修复,即可通过对应用程序中的相关函数(内联函数和/或被内联函数)打补丁,以修复该应用程序,进而兼容新的数据格式、使得路由器对数据的统计更精确或者路由器的内存可正常释放。
示例性的,以路由器需兼容新的数据格式为例,对应于本发明实施例提供的一种补丁的生成方法及打补丁的方法,对应用程序中的被内联函数,即被调用函数实现打补丁的步骤为:
(1)在对应用程序的源代码进行编译时,由于内联函数与被内联函数之间为函数调用关系,且内联函数调用被内联函数,即被内联函数为被调用函数,内联函数为调用函数,编译器1510则将内联函数与被内联函数进行函数内联,以生成第三函数。
(2)编译器1510根据内联函数对被内联函数进行函数内联后的第三函数,生成等价于第三函数的等价代码段,并将等价代码段保存至相应的文件中。
(3)编译器1510输出内联函数及被内联函数在内存中的存放地址,并将该地址存放在相应的文件中。
(4)当补丁制作客户端1511制作补丁文件时,补丁制作客户端1511加载软件开发人员提供的用于修复被内联函数的第一修复函数、等价代码段以及编译器1510输出的用于存放内联函数及被内联函数的地址。
(5)补丁制作客户端1511根据该地址,将等价代码段中的被内联函数替换为第一修复函数,以生成对应于第一修复函数的补丁文件。
(6)当补丁管理客户端2310对某些应用程序中的被内联函数打补丁时,如图6所示,补丁管理客户端2310根据编译器1510输出的用于存放内联函数及被内联函数的地址,将被内联函数的代码修改为跳转指令,从而系统在执行被内联函数时,若执行到跳转指令,则将跳转至等价代码段的开始处开始执行,在执行等价代码段的过程中,系统将根据等价代码段中的调用指令“callfunc”调用第一修复函数,即系统将转去执行第一修复函数,执行完第一修复函数后,再返回至等价代码段中的调用指令后,通过执行等价代码段中的跳转指令再返回至被内联函数处,继续执行跳转指令后的其他指令,进而继续运行该应用程序。
至此,完成了对被调用函数打补丁的过程。
结合本发明实施例提供的一种补丁的生成方法及打补丁的方法,本发明实施例提供的一种补丁的实现系统3,通过在编译过程中,编译器1510生成等价代码段,以及保存内联函数及被内联函数的存放地址;在补丁制作过程中,补丁制作客户端1511根据上述地址,将等价代码段中的被内联函数替换为软件开发人员提供的第一修复函数,以生成对应于第一修复函数的补丁文件;在打补丁的过程中,补丁管理客户端2310根据上述地址将被内联函数的代码修改为一条跳转指令,从而,使得用户端设备的系统在执行被内联函数时,根据相应的跳转指令转去执行相应的等价代码段和第一修复函数,进而实现对被内联函数打补丁,即实现对被内联函数的修复。
示例性的,以路由器需兼容新的数据格式为例,对应于本发明实施例提供的一种补丁的生成方法及打补丁的方法,对应用程序中的内联函数,即调用函数实现打补丁的步骤为:
(1)在对应用程序的源代码进行编译时,由于内联函数与被内联函数之间为函数调用关系,且内联函数调用被内联函数,即被内联函数为被调用函数,内联函数为调用函数,编译器1510则将内联函数与被内联函数进行函数内联。
(2)编译器1510保存用于与内联函数进行函数内联的被内联函数的函数体。
(3)编译器1510输出内联函数及被内联函数在内存中的存放地址,以及函数内联关系图,并将该地址及函数内联关系图保存至相应的文件中,内联关系图用于指示被内联函数的函数内联关系。
(4)补丁制作客户端1511根据函数内联关系图在整个服务端设备的系统中查找是否存在被内联函数的函数体,若未查找到被内联函数的函数体,补丁制作客户端1511则加载(2)中保存的被内联函数的函数体至本地内存中;若查找到被内联函数的函数体,在对内联函数打补丁时,服务端设备的系统可直接调用被内联函数的函数体。
(5)当补丁制作客户端1511制作补丁文件时,补丁制作客户端1511加载软件开发人员提供的用于修复内联函数的第二修复函数、被内联函数的函数体,以及编译器1510输出的用于存放内联函数及被内联函数的地址。
(6)补丁制作客户端1511根据用于存放内联函数及被内联函数的地址,将第二修复函数与被内联函数的函数体结合,以生成对应于第二修复函数的补丁文件。
(7)当补丁管理客户端2310对应用程序中的内联函数打补丁时,如图8所示,补丁管理客户端2310根据编译器1510输出的用于存放内联函数及被内联函数的地址,将内联函数的代码修改为跳转指令,从而系统在执行内联函数时,若执行到跳转指令,则将跳转至第二修复函数的开始处开始执行,在执行第二修复函数的过程中,系统将根据第二修复函数中的调用指令“callfunc”调用被内联函数的函数体,即系统将转去执行被内联函数的函数体,执行完被内联函数的函数体后,再返回至第二修复函数中,通过执行第二修复函数中的跳转指令再返回至内联函数的跳转指令后的地址,继续执行其他指令,进而继续运行该应用程序。
至此,完成了对调用函数打补丁的过程。
结合本发明实施例提供的一种补丁的生成方法及打补丁的方法,本发明实施例提供的一种补丁的实现系统3,通过在编译过程中,编译器1510保存用于与内联函数进行函数内联的被内联函数的函数体、内联函数及被内联函数的存放地址,以及用于指示被内联函数的函数内联关系的函数内联关系图;在补丁制作过程中,补丁制作客户端1511根据上述地址,将软件开发人员提供的第二修复函数与被内联函数的函数体结合,以生成对应于第二修复函数的补丁文件;在打补丁的过程中,补丁管理客户端2310根据上述地址将内联函数的代码修改为一条跳转指令,从而,使得用户端设备的系统在执行内联函数时,根据相应的跳转指令转去执行相应的第二修复函数,以及调用被内联函数的函数体,进而实现对内联函数打补丁的过程,即实现对内联函数的修复。
本发明实施例提供的补丁实现系统,通过编译器在编译阶段提供函数进行函数内联的相关信息,如用于存放内联函数及被内联函数的地址、函数内联关系图、被内联函数的函数体,以及等价代码段等,使得补丁制作客户端根据上述信息,应用本发明实施例提供的补丁的生成方法,生成相应的补丁文件,从而使得补丁管理客户端根据该补丁文件及编译器提供的上述地址,对被内联函数(被调用函数)和/或内联函数(调用函数)打补丁,即对被内联函数和/或内联函数进行修复,从而解决了现有技术中无法方便地对经过函数内联的函数打热补丁,进而使得软件开发人员可以按照未进行函数内联的方法制作相应的补丁文件,即,即使函数经过了函数内联,软件开发人员也只需重新编写出现问题或漏洞的函数即可,不用重新编写进行函数内联的其他函数,以及,应用本发明实施例提供的补丁的生成方法及打补丁的方法,即可实现对相应的函数进行修复的目的,从而简化了操作,为用户端设备的应用程序及系统的快速修复提供了保障。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述模块或单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)或处理器(processor)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-OnlyMemory)、随机存取存储器(RAM,RandomAccessMemory)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。

Claims (24)

1.一种补丁的生成方法,应用于对被内联函数打补丁的场景,其特征在于,包括:
将内联函数与所述被内联函数进行函数内联,以生成第三函数,所述内联函数为调用函数,所述被内联函数为被调用函数;
根据所述第三函数,生成等价于所述第三函数的等价代码段;
获取用于存放所述内联函数及所述被内联函数的地址;
获取用于修复所述被内联函数的第一修复函数;
根据所述地址,将所述等价代码段中的所述被内联函数替换为所述第一修复函数,以生成补丁文件;
输出所述地址及所述补丁文件至用户端设备,以使所述用户端设备根据所述地址及所述补丁文件修复所述被内联函数。
2.根据权利要求1所述的补丁的生成方法,其特征在于,所述根据所述第三函数,生成等价于所述第三函数的等价代码段的方法具体包括:
根据所述第三函数,确定所述内联函数对所述被内联函数进行函数调用的调用关系;
根据所述调用关系,生成所述等价代码段。
3.根据权利要求1或2所述的补丁的生成方法,其特征在于,所述等价代码段保存于可执行链接格式ELF文件中。
4.一种打补丁的方法,应用于对被内联函数打补丁的场景,其特征在于,包括:
接收来自服务端设备的地址及补丁文件,其中,所述地址为所述服务端设备获取的用于存放内联函数及所述被内联函数的地址,所述内联函数为调用函数,所述被内联函数为被调用函数;
所述补丁文件为所述服务端设备将所述内联函数与所述被内联函数进行函数内联,以生成第三函数,并根据所述第三函数,生成等价于所述第三函数的等价代码段,且获取用于存放所述内联函数及所述被内联函数的地址,以及获取用于修复所述被内联函数的第一修复函数后,所述服务端设备根据所述地址,将所述等价代码段中的所述被内联函数替换为所述第一修复函数生成的;
根据所述地址及所述补丁文件修复所述被内联函数。
5.根据权利要求4所述的打补丁的方法,其特征在于,所述根据所述地址及所述补丁文件修复所述被内联函数的方法具体包括:
根据所述地址,将所述被内联函数的代码修改为跳转指令,所述跳转指令用于指示所述补丁文件的起始地址;
根据所述跳转指令,执行所述补丁文件,以修复所述被内联函数。
6.根据权利要求4或5所述的打补丁的方法,其特征在于,所述等价代码段保存于ELF文件中。
7.一种补丁的生成方法,应用于对内联函数打补丁的场景,其特征在于,包括:
保存用于与所述内联函数进行函数内联的被内联函数的函数体,所述内联函数为调用函数,所述被内联函数为被调用函数;
获取用于存放所述内联函数及所述被内联函数的地址;
获取用于修复所述内联函数的第二修复函数;
根据所述地址,将所述被内联函数的函数体与所述第二修复函数结合,以生成补丁文件;
输出所述地址及所述补丁文件至用户端设备,以使所述用户端设备根据所述地址及所述补丁文件修复所述内联函数。
8.根据权利要求7所述的补丁的生成方法,其特征在于,所述根据所述地址,将所述被内联函数的函数体与所述第二修复函数结合,以生成补丁文件之前,所述方法还包括:
获取函数内联关系图,所述函数内联关系图用于指示所述被内联函数的函数内联关系;
根据所述函数内联关系图查找是否存在所述被内联函数的函数体;
若未查找到所述被内联函数的函数体,则加载所述被内联函数的函数体至本地内存中。
9.根据权利要求7或8所述的补丁的生成方法,其特征在于,所述被内联函数的函数体保存于ELF文件中。
10.一种打补丁的方法,应用于对内联函数打补丁的场景,其特征在于,包括:
接收来自服务端设备的地址及补丁文件,其中,所述地址为所述服务端设备获取的用于存放所述内联函数及被内联函数的地址,所述内联函数为调用函数,所述被内联函数为被调用函数;
所述补丁文件为所述服务端设备保存用于与所述内联函数进行函数内联的所述被内联函数的函数体,并获取用于存放所述内联函数及所述被内联函数的地址,以及获取用于修复所述内联函数的第二修复函数后,所述服务端设备根据所述地址,将所述被内联函数的函数体与所述第二修复函数结合生成的;
根据所述地址及所述补丁文件修复所述内联函数。
11.根据权利要求10所述的打补丁的方法,其特征在于,所述根据所述地址及所述补丁文件修复所述内联函数的方法具体包括:
根据所述地址,将所述内联函数的代码修改为跳转指令,所述跳转指令用于指示所述补丁文件的起始地址;
根据所述跳转指令,执行所述补丁文件,以修复所述内联函数。
12.根据权利要求10或11所述的打补丁的方法,其特征在于,所述被内联函数的函数体保存于ELF文件中。
13.一种服务端设备,应用于对被内联函数打补丁的场景,其特征在于,包括:
第一处理单元,用于将内联函数与所述被内联函数进行函数内联,以生成第三函数,并根据所述第三函数,生成等价于所述第三函数的等价代码段,所述内联函数为调用函数,所述被内联函数为被调用函数;
第一获取单元,用于获取用于存放所述内联函数及所述被内联函数的地址,以及获取用于修复所述被内联函数的第一修复函数;
所述第一处理单元,还用于根据所述地址,将所述等价代码段中所述被内联函数替换为所述第一修复函数,以生成补丁文件;
第一输出单元,用于输出所述地址及所述补丁文件至用户端设备,以使所述用户端设备根据所述地址及所述补丁文件修复所述被内联函数。
14.根据权利要求13所述的服务端设备,其特征在于,
所述第一处理单元,具体用于根据所述第三函数,确定所述内联函数对所述被内联函数进行函数调用的调用关系,以及根据所述调用关系,生成所述等价代码段。
15.根据权利要求13或14所述的服务端设备,其特征在于,所述等价代码段保存于ELF文件中。
16.一种用户端设备,应用于对被内联函数打补丁的场景,其特征在于,包括:
第二接收单元,用于接收来自服务端设备的地址及补丁文件,其中,所述地址为所述服务端设备获取的用于存放内联函数及所述被内联函数的地址,所述内联函数为调用函数,所述被内联函数为被调用函数;
所述补丁文件为所述服务端设备将所述内联函数与所述被内联函数进行函数内联,以生成第三函数,并根据所述第三函数,生成等价于所述第三函数的等价代码段,且获取用于存放所述内联函数及所述被内联函数的地址,以及获取用于修复所述被内联函数的第一修复函数后,所述服务端设备根据所述地址,将所述等价代码段中的所述被内联函数替换为所述第一修复函数生成的;
第二处理单元,用于根据所述地址及所述补丁文件修复所述被内联函数。
17.根据权利要求16所述的用户端设备,其特征在于,
所述第二处理单元,具体用于根据所述地址,将所述被内联函数的代码修改为跳转指令,所述跳转指令用于指示所述补丁文件的起始地址,以及根据所述跳转指令,执行所述补丁文件,以修复所述被内联函数。
18.根据权利要求16或17所述的用户端设备,其特征在于,所述等价代码段保存于ELF文件中。
19.一种服务端设备,应用于对内联函数打补丁的场景,其特征在于,包括:
第一存储单元,用于保存用于与所述内联函数进行函数内联的被内联函数的函数体,所述内联函数为调用函数,所述被内联函数为被调用函数;
第一获取单元,用于获取用于存放所述内联函数及所述被内联函数的地址,以及获取用于修复所述内联函数的第二修复函数;
第一处理单元,用于根据所述地址,将所述被内联函数的函数体与所述第二修复函数结合,以生成补丁文件;
第一输出单元,用于输出所述地址及所述补丁文件至用户端设备,以使所述用户端设备根据所述地址及所述补丁文件修复所述内联函数。
20.根据权利要求19所述的服务端设备,其特征在于,
所述第一获取单元,还用于获取函数内联关系图,所述函数内联关系图用于指示所述被内联函数的函数内联关系;
所述第一处理单元,还用于根据所述函数内联关系图查找是否存在所述被内联函数的函数体,以及若未查找到所述被内联函数的函数体,则加载所述被内联函数的函数体至本地内存中。
21.根据权利要求19或20所述的服务端设备,其特征在于,所述被内联函数的函数体保存于ELF文件中。
22.一种用户端设备,应用于对内联函数打补丁的场景,其特征在于,包括:
第二接收单元,用于接收来自服务端设备的地址及补丁文件,其中,所述地址为所述服务端设备获取的用于存放所述内联函数及被内联函数的地址,所述内联函数为调用函数,所述被内联函数为被调用函数;
所述补丁文件为所述服务端设备保存用于与所述内联函数进行函数内联的所述被内联函数的函数体,并获取用于存放所述内联函数及所述被内联函数的地址,以及获取用于修复所述内联函数的第二修复函数后,所述服务端设备根据所述地址,将所述被内联函数的函数体与所述第二修复函数结合生成的;
第二处理单元,用于根据所述地址及所述补丁文件修复所述内联函数。
23.根据权利要求22所述的用户端设备,其特征在于,
所述第二处理单元,具体用于根据所述地址,将所述内联函数的代码修改为跳转指令,所述跳转指令用于指示所述补丁文件的起始地址,以及根据所述跳转指令,执行所述补丁文件,以修复所述内联函数。
24.根据权利要求22或23所述的用户端设备,其特征在于,所述被内联函数的函数体保存于ELF文件中。
CN201310086466.3A 2013-03-18 2013-03-18 一种补丁的生成方法、打补丁的方法及装置 Expired - Fee Related CN103197942B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201310086466.3A CN103197942B (zh) 2013-03-18 2013-03-18 一种补丁的生成方法、打补丁的方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201310086466.3A CN103197942B (zh) 2013-03-18 2013-03-18 一种补丁的生成方法、打补丁的方法及装置

Publications (2)

Publication Number Publication Date
CN103197942A CN103197942A (zh) 2013-07-10
CN103197942B true CN103197942B (zh) 2016-03-02

Family

ID=48720537

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201310086466.3A Expired - Fee Related CN103197942B (zh) 2013-03-18 2013-03-18 一种补丁的生成方法、打补丁的方法及装置

Country Status (1)

Country Link
CN (1) CN103197942B (zh)

Families Citing this family (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105446712B (zh) * 2014-08-08 2020-04-03 阿里巴巴集团控股有限公司 一种应用程序缺陷修补方法及装置
CN105159738A (zh) * 2015-08-20 2015-12-16 上海斐讯数据通信技术有限公司 一种热补丁实现方法及系统
CN105573788B (zh) * 2015-12-15 2019-02-26 华为技术有限公司 补丁处理的方法和设备以及生成补丁的方法和设备
CN107451474B (zh) * 2016-05-31 2020-06-26 百度在线网络技术(北京)有限公司 用于终端的软件漏洞修复方法和装置
CN107870777A (zh) * 2016-09-23 2018-04-03 中兴通讯股份有限公司 一种热补丁实现方法及装置、终端
CN107861748A (zh) * 2017-12-04 2018-03-30 山东浪潮通软信息科技有限公司 一种补丁生成方法及装置
CN110532070B (zh) * 2018-05-24 2022-02-18 武汉斗鱼网络科技有限公司 用于方法调用的方法、存储介质、设备及系统
CN108762787B (zh) * 2018-05-31 2024-04-05 康键信息技术(深圳)有限公司 软件修复方法、装置、计算机设备和存储介质
CN111930412A (zh) * 2019-05-13 2020-11-13 阿里巴巴集团控股有限公司 差分文件生成及固件在线升级的方法和装置
CN112035153B (zh) * 2019-05-14 2021-08-24 腾讯科技(深圳)有限公司 应用更新方法、装置、终端及存储介质
CN112115477B (zh) * 2020-08-17 2022-06-21 南方科技大学 内核修复方法、装置、电子设备及存储介质
CN113176989A (zh) * 2021-05-27 2021-07-27 北京字节跳动网络技术有限公司 日志文件的解析方法、装置、设备及存储介质

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6438621B1 (en) * 1994-11-14 2002-08-20 Microsoft Corporation In-memory modification of computer programs
CN101154187A (zh) * 2006-09-29 2008-04-02 英特尔公司 用于为程序打补丁的方法、产品、服务处理器和系统
CN102609241A (zh) * 2012-01-19 2012-07-25 中兴通讯股份有限公司 热补丁方法及装置

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6438621B1 (en) * 1994-11-14 2002-08-20 Microsoft Corporation In-memory modification of computer programs
CN101154187A (zh) * 2006-09-29 2008-04-02 英特尔公司 用于为程序打补丁的方法、产品、服务处理器和系统
CN102609241A (zh) * 2012-01-19 2012-07-25 中兴通讯股份有限公司 热补丁方法及装置

Also Published As

Publication number Publication date
CN103197942A (zh) 2013-07-10

Similar Documents

Publication Publication Date Title
CN103197942B (zh) 一种补丁的生成方法、打补丁的方法及装置
US8726255B2 (en) Recompiling with generic to specific replacement
CN101799763B (zh) 内核在线补丁的方法、装置和系统
CN103797436B (zh) 用于计算装置的动态电力优化
EP1728155B1 (en) Method and system for performing link-time code optimization without additional code analysis
US20110126179A1 (en) Method and System for Dynamic Patching Software Using Source Code
CN103473067A (zh) 嵌入式Linux分区与数据还原方法、系统及系统开发方法
CN101859244A (zh) 多工具链工程构建方法及系统
CN102646035A (zh) 基于api接口和脚本定义相结合的可视化代码生成方法
CN104267978A (zh) 一种生成差分包的方法及装置
EP3244306A1 (en) A computer-implemented method for allowing modification of a region of original code
CN106020905A (zh) 一种微控制器固件开发与更新的方法及系统
CN110990019A (zh) 一种Java类分析方法、装置、存储介质及电子设备
CN103345412A (zh) 打补丁的方法及装置
CN102364433B (zh) 在ARM处理器上实现Wine构建工具移植的方法
CN103645888A (zh) 一种自动构建操作系统的系统及方法
CN104407852A (zh) 一种基于代码隔离的嵌入式软件构建方法和调用方法
US10545740B2 (en) Distributed agent to collect input and output data along with source code for scientific kernels of single-process and distributed systems
US20150355997A1 (en) Server-Platform Simulation Service
CN103631585A (zh) 一种用于开发应用程序的方法及系统
CN110990177A (zh) 故障修复方法、装置、系统、存储介质及电子设备
US20150178074A1 (en) Method, a system, and a non-transitory computer-readable medium for supporting application development
CN111880803B (zh) 一种应用于多平台的软件构建方法及装置
JP2007080049A (ja) 組み込み用プログラム生成方法、組み込み用プログラム開発システム、及び情報テーブル部
US9891894B1 (en) Code continuity preservation during automatic code generation

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20160302

Termination date: 20180318

CF01 Termination of patent right due to non-payment of annual fee