首页 / 专利库 / 软件 / 补丁 / 热补丁 / 一种补丁的生成方法、打补丁的方法及装置

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

阅读:1001发布:2020-07-11

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

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文件中。

说明书全文

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

技术领域

[0001] 本发明涉及计算机领域,尤其涉及一种补丁的生成方法、打补丁的方法及装置。

背景技术

[0002] 随着编译器优化性能的不断提高,与未经编译器优化的代码的性能相比,经过编译器优化后的代码的性能明显优于未经过编译器优化的代码的性能。
[0003] 目前,在应用程序开发过程中,难免存在一些软件设计方面的漏洞或用户对该应用程序的新的需求,为了不影响应用程序的使用,一般以热补丁的方式对该应用程序进行漏洞修复或更新,即在不中止应用程序的情况下对该应用程序进行修复或更新。热补丁的处理方式基本是以函数为单位的,即可通过对出现漏洞或需要更新的函数进行修复,以实现对该应用程序的修复。
[0004] 现有技术中,若应用程序的函数之间没有经过编译器的inline(函数内联)优化,则可直接以热补丁的处理方式对出现漏洞或需要更新的函数进行修复或更新;若应用程序的函数之间进行了inline优化,则当应用程序中的某一个函数出现漏洞或需要更新时,软件开发人员则需要重新设计进行inline优化的所有函数,从而以完成对该应用程序的修复或更新。
[0005] 然而,上述未经inline优化的函数,虽然可直接对出现漏洞或需要更新的函数进行修复或更新,但是,未经inline优化的函数对最终生成的应用程序的性能有很大的影响;而经过inline优化的函数,为了修复或更新应用程序中的某一个函数,软件开发人员除了重新设计需要修复或更新的该函数外,往往还需重新设计进行inline优化的其他函数,若将该其他函数加载到有限的补丁区,则严重缩短了补丁区的生命周期。

发明内容

[0006] 本发明的实施例提供一种补丁的生成方法、打补丁的方法及装置,能够在函数内联优化与热补丁共存的同时,快速地修复经过函数内联的应用程序。
[0007] 为达到上述目的,本发明的实施例采用如下技术方案:
[0008] 第一方面,本发明实施例提供一种补丁的生成方法,应用于对被内联函数打补丁的场景,包括:
[0009] 将内联函数与所述被内联函数进行函数内联,以生成第三函数;
[0010] 根据所述第三函数,生成等价于所述第三函数的等价代码段;
[0011] 获取用于存放所述内联函数及所述被内联函数的地址;
[0012] 获取用于修复所述被内联函数的第一修复函数;
[0013] 根据所述地址,将所述等价代码段中的所述被内联函数替换为所述第一修复函数,以生成补丁文件;
[0014] 输出所述地址及所述补丁文件至用户端设备,以使所述用户端设备根据所述地址及所述补丁文件修复所述被内联函数。
[0015] 在第一方面的第一种可能的实现方式中,所述根据所述第三函数,生成等价于所述第三函数的等价代码段的方法具体包括:
[0016] 根据所述第三函数,确定所述内联函数对所述被内联函数进行函数调用的调用关系;
[0017] 根据所述调用关系,生成所述等价代码段。
[0018] 结合前述的第一方面或第一方面的第一种可能的实现方式,在第二种可能的实现方式中,所述等价代码段保存于可执行链接格式ELF文件中。
[0019] 第二方面,本发明实施例还提供一种打补丁的方法,应用于对被内联函数打补丁的场景,包括:
[0020] 接收来自服务端设备的地址及补丁文件,其中,所述地址为所述服务端设备获取的用于存放内联函数及所述被内联函数的地址,
[0021] 所述补丁文件为所述服务端设备将所述内联函数与所述被内联函数进行函数内联,以生成第三函数,并根据所述第三函数,生成等价于所述第三函数的等价代码段,且获取用于存放所述内联函数及所述被内联函数的地址,以及获取用于修复所述被内联函数的第一修复函数后,所述服务端设备根据所述地址,将所述等价代码段中的所述被内联函数替换为所述第一修复函数生成的;
[0022] 根据所述地址及所述补丁文件修复所述被内联函数。
[0023] 在第二方面的第一种可能的实现方式中,所述根据所述地址及所述补丁文件修复所述被内联函数的方法具体包括:
[0024] 根据所述地址,将所述被内联函数的代码修改为跳转指令,所述跳转指令用于指示所述补丁文件的起始地址;
[0025] 根据所述跳转指令,执行所述补丁文件,以修复所述被内联函数。
[0026] 结合前述的第二方面或第二方面的第一种可能的实现方式,在第二种可能的实现方式中,所述等价代码段保存于ELF文件中。
[0027] 第三方面,本发明实施例提供一种服务端设备,应用于对被内联函数打补丁的场景,包括:
[0028] 第一处理单元,用于将内联函数与所述被内联函数进行函数内联,以生成第三函数,并根据所述第三函数,生成等价于所述第三函数的等价代码段;
[0029] 第一获取单元,用于获取用于存放所述内联函数及所述被内联函数的地址,以及获取用于修复所述被内联函数的第一修复函数;
[0030] 所述第一处理单元,还用于根据所述地址,将所述等价代码段中所述被内联函数替换为所述第一修复函数,以生成补丁文件;
[0031] 第一输出单元,用于输出所述地址及所述补丁文件至用户端设备,以使所述用户端设备根据所述地址及所述补丁文件修复所述被内联函数。
[0032] 在第三方面的第一种可能的实现方式中,
[0033] 所述第一处理单元,具体用于根据所述第三函数,确定所述内联函数对所述被内联函数进行函数调用的调用关系,以及根据所述调用关系,生成所述等价代码段。
[0034] 结合前述的第三方面或第三方面的第一种可能的实现方式,在第二种可能的实现方式中,所述等价代码段保存于ELF文件中。
[0035] 第四方面,本发明实施例提供一种用户端设备,应用于对被内联函数打补丁的场景,包括:
[0036] 第二接收单元,用于接收来自服务端设备的地址及补丁文件,其中,所述地址为所述服务端设备获取的用于存放内联函数及所述被内联函数的地址,
[0037] 所述补丁文件为所述服务端设备将所述内联函数与所述被内联函数进行函数内联,以生成第三函数,并根据所述第三函数,生成等价于所述第三函数的等价代码段,且获取用于存放所述内联函数及所述被内联函数的地址,以及获取用于修复所述被内联函数的第一修复函数后,所述服务端设备根据所述地址,将所述等价代码段中的所述被内联函数替换为所述第一修复函数生成的;
[0038] 第二处理单元,用于根据所述地址及所述补丁文件修复所述被内联函数。
[0039] 在第四方面的第一种可能的实现方式中,
[0040] 所述第二处理单元,具体用于根据所述地址,将所述被内联函数的代码修改为跳转指令,所述跳转指令用于指示所述补丁文件的起始地址,以及根据所述跳转指令,执行所述补丁文件,以修复所述被内联函数。
[0041] 结合前述的第四方面或第四方面的第一种可能的实现方式,在第二种可能的实现方式中,所述等价代码段保存于ELF文件中。
[0042] 本发明实施例提供一种补丁的生成方法、打补丁的方法及装置,通过将内联函数与被内联函数进行函数内联,以生成第三函数,并根据第三函数,生成等价于第三函数的等价代码段,且获取用于存放内联函数及被内联函数的地址,以及获取用于修复被内联函数的第一修复函数,从而根据上述地址,将等价代码段中的被内联函数替换为第一修复函数,以生成补丁文件,进而输出该地址及补丁文件至用户端设备,以使用户端设备根据该地址及补丁文件修复被内联函数。通过该方案,若需对应用程序中经过函数内联的被内联函数进行修复或更新,软件开发人员则可以只重新编写需要修复或更新的被内联函数即可,同时通过在编译过程中生成相应的等价代码段,从而实现对被内联函数的修复或更新,能够在函数内联优化与热补丁共存的同时,快速地修复经过函数内联的应用程序。
[0043] 第五方面,本发明实施例还提供一种补丁的生成方法,应用于对内联函数打补丁的场景,包括:
[0044] 保存用于与所述内联函数进行函数内联的被内联函数的函数体;
[0045] 获取用于存放所述内联函数及所述被内联函数的地址;
[0046] 获取用于修复所述内联函数的第二修复函数;
[0047] 根据所述地址,将所述被内联函数的函数体与所述第二修复函数结合,以生成补丁文件;
[0048] 输出所述地址及所述补丁文件至用户端设备,以使所述用户端设备根据所述地址及所述补丁文件修复所述内联函数。
[0049] 在第五方面的第一种可能的实现方式中,所述根据所述地址,将所述被内联函数的函数体与所述第二修复函数结合,以生成补丁文件之前,所述方法还包括:
[0050] 获取函数内联关系图,所述函数内联关系图用于指示所述被内联函数的函数内联关系;
[0051] 根据所述函数内联关系图查找是否存在所述被内联函数的函数体;
[0052] 若未查找到所述被内联函数的函数体,则加载所述被内联函数的函数体至本地内存中。
[0053] 结合前述的第五方面或第五方面的第一种可能的实现方式,在第二种可能的实现方式中,所述被内联函数的函数体保存于ELF文件中。
[0054] 第六方面,本发明实施例还提供一种打补丁的方法,应用于对内联函数打补丁的场景,包括:
[0055] 接收来自服务端设备的地址及补丁文件,其中,所述地址为所述服务端设备获取的用于存放所述内联函数及被内联函数的地址,
[0056] 所述补丁文件为所述服务端设备保存用于与所述内联函数进行函数内联的所述被内联函数的函数体,并获取用于存放所述内联函数及所述被内联函数的地址,以及获取用于修复所述内联函数的第二修复函数后,所述服务端设备根据所述地址,将所述被内联函数的函数体与所述第二修复函数结合生成的;
[0057] 根据所述地址及所述补丁文件修复所述内联函数。
[0058] 在第六方面的第一种可能的实现方式中,所述根据所述地址及所述补丁文件修复所述内联函数的方法具体包括:
[0059] 根据所述地址,将所述内联函数的代码修改为跳转指令,所述跳转指令用于指示所述补丁文件的起始地址;
[0060] 根据所述跳转指令,执行所述补丁文件,以修复所述内联函数。
[0061] 结合前述的第六方面或第六方面的第一种可能的实现方式,在第二种可能的实现方式中,所述被内联函数的函数体保存于ELF文件中。
[0062] 第七方面,本发明实施例还提供一种服务端设备,应用于对内联函数打补丁的场景,包括:
[0063] 第一存储单元,用于保存用于与所述内联函数进行函数内联的被内联函数的函数体;
[0064] 第一获取单元,用于获取用于存放所述内联函数及所述被内联函数的地址,以及获取用于修复所述内联函数的第二修复函数;
[0065] 第一处理单元,用于根据所述地址,将所述被内联函数的函数体与所述第二修复函数结合,以生成补丁文件;
[0066] 第一输出单元,用于输出所述地址及所述补丁文件至用户端设备,以使所述用户端设备根据所述地址及所述补丁文件修复所述内联函数。
[0067] 在第七方面的第一种可能的实现方式中,
[0068] 所述第一获取单元,还用于获取函数内联关系图,所述函数内联关系图用于指示所述被内联函数的函数内联关系;
[0069] 所述第一处理单元,还用于根据所述函数内联关系图查找是否存在所述被内联函数的函数体,以及若未查找到所述被内联函数的函数体,则加载所述被内联函数的函数体至本地内存中。
[0070] 结合前述的第七方面或第七方面的第一种可能的实现方式,在第二种可能的实现方式中,所述被内联函数的函数体保存于ELF文件中。
[0071] 第八方面,本发明实施例还提供一种用户端设备,应用于对内联函数打补丁的场景,包括:
[0072] 第二接收单元,用于接收来自服务端设备的地址及补丁文件,其中,所述地址为所述服务端设备获取的用于存放所述内联函数及被内联函数的地址,
[0073] 所述补丁文件为所述服务端设备保存用于与所述内联函数进行函数内联的所述被内联函数的函数体,并获取用于存放所述内联函数及所述被内联函数的地址,以及获取用于修复所述内联函数的第二修复函数后,所述服务端设备根据所述地址,将所述被内联函数的函数体与所述第二修复函数结合生成的;
[0074] 第二处理单元,用于根据所述地址及所述补丁文件修复所述内联函数。
[0075] 在第八方面的第一种可能的实现方式中,
[0076] 所述第二处理单元,具体用于根据所述地址,将所述内联函数的代码修改为跳转指令,所述跳转指令用于指示所述补丁文件的起始地址,以及根据所述跳转指令,执行所述补丁文件,以修复所述内联函数。
[0077] 结合前述的第八方面或第八方面的第一种可能的实现方式,在第二种可能的实现方式中,所述被内联函数的函数体保存于ELF文件中。
[0078] 本发明实施例提供一种补丁的生成方法、打补丁的方法及装置,通过保存用于与内联函数进行函数内联的被内联函数的函数体,并获取用于存放内联函数及被内联函数的地址,以及获取用于修复内联函数的第二修复函数,从而根据上述地址,将被内联函数的函数体与第二修复函数结合,以生成补丁文件,进而输出该地址及补丁文件至用户端设备,以使用户端设备根据该地址及补丁文件修复内联函数。通过该方案,若需对应用程序中经过函数内联的内联函数进行修复或更新,软件开发人员则可以只重新编写需要修复或更新的内联函数即可,同时通过在编译过程中保存被内联函数的函数体,从而实现对内联函数的修复或更新,能够在函数内联优化与热补丁共存的同时,快速地修复经过函数内联的应用程序。附图说明
[0079] 为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
[0080] 图1为本发明实施例提供的一种补丁的生成方法的流程图一;
[0081] 图2为本发明实施例提供的一种打补丁的方法的流程图一;
[0082] 图3为本发明实施例提供的一种补丁的生成方法的流程图二;
[0083] 图4为本发明实施例提供的一种打补丁的方法的流程图二;
[0084] 图5为本发明实施例提供的一种补丁的生成方法及打补丁的方法的流程图三;
[0085] 图6为本发明实施例提供的一种打补丁的方法的原理示意图一;
[0086] 图7为本发明实施例提供的一种补丁的生成方法及打补丁的方法的流程图四;
[0087] 图8为本发明实施例提供的一种打补丁的方法的原理示意图二;
[0088] 图9为本发明实施例提供的一种服务端设备的结构示意图一;
[0089] 图10为本发明实施例提供的一种用户端设备的结构示意图一;
[0090] 图11为本发明实施例提供的一种服务端设备的结构示意图二;
[0091] 图12为本发明实施例提供的一种服务端设备的结构示意图三;
[0092] 图13为本发明实施例提供的一种用户端设备的结构示意图二;
[0093] 图14为本发明实施例提供的一种补丁的实现系统框图

具体实施方式

[0094] 下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0095] 本文中术语“和/或”,仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,本文中字符“/”,一般表示前后关联对象是一种“或”的关系。
[0096] 为了方便理解本发明实施例,首先在此介绍本发明实施例描述中会引入的几个要素。
[0097] inline:函数内联,为将被调用函数集成到调用函数的内部,类似于宏展开。
[0098] ELF:可执行链接格式(Executable and Linking Format)。
[0099] 实施例一
[0100] 本发明实施例提供一种补丁的生成方法,应用于对被内联函数打补丁的场景,即对应于对被调用函数打补丁的过程,该方法涉及服务端设备,如图1所示,包括:
[0101] S101、服务端设备将内联函数与被内联函数进行函数内联,以生成第三函数。
[0102] 其中,服务端设备是为用户端设备服务的,服务端设备服务的内容包括向用户端设备提供资源,保存用户端设备的数据等。本发明实施例中,服务端设备通过获取软件开发人员提供的,对某些函数进行修改后的函数后,生成对应于该修改后的函数的补丁文件,并向用户端设备提供该补丁文件,以使得用户端设备使用该补丁文件对该某些函数打补丁,即对该某些函数进行修复。
[0103] 一个应用程序的源代码包括多个函数,若该应用程序出现漏洞或需要更新,则可以以函数为单位对该应用程序进行修复或更新,也就是说,可以通过修复相应的出现漏洞或需要更新的函数,进而修复该应用程序。
[0104] 其中,“函数”为表示每个输入值对应唯一输出值的一种对应关系。在计算机领域内,函数的语句用于完成某些有意义的工作——通常是处理文本,控制输入或计算数值等。在编写程序代码时,软件开发人员通过在程序代码中引入函数名称和所需的参数,可使得系统在执行该程序代码时相应地执行(或称调用)该函数。
[0105] 在对源代码进行编译的过程中,服务端设备往往会将源代码中的调用函数与被调用函数进行函数内联,即将被调用函数的函数体直接嵌入到调用函数的函数体中,以提高编译后代码的性能。
[0106] 本发明实施例中,内联函数与被内联函数之间为函数调用的关系,且内联函数调用被内联函数,即被内联函数为被调用函数,内联函数为调用函数,这样,在编译源代码的过程中,服务端设备往往会将内联函数与被内联函数进行函数内联,即将被内联函数的函数体嵌入到内联函数的函数体中,以生成第三函数。
[0107] S102、服务端设备根据第三函数,生成等价于第三函数的等价代码段。
[0108] 服务端设备在将内联函数与被内联函数进行函数内联时,服务端设备根据内联函数对被内联函数进行函数内联后的第三函数,生成等价于第三函数的等价代码段。
[0109] 需要说明的是,等价代码段的原理为将内联函数对被内联函数进行函数内联后的第三函数逆向为内联函数对被内联函数进行函数调用的代码段。
[0110] 例如,若内联函数为:
[0111] test()
[0112] {
[0113] func();
[0114] }
[0115] 被内联函数为:
[0116]
[0117]
[0118] 那么,将内联函数与被内联函数进行函数内联,即内联函数对被内联函数进行函数内联后所得的第三函数为:
[0119]
[0120] 需要说明的是,被内联函数中的“push %ebp;mov%esp,ebp;”语句为函数的入栈指令,“leave;ret;”语句为执行完被内联函数后的返回指令,由于内联函数对被内联函数进行了函数内联,即将被内联函数的函数体嵌入到内联函数的函数体内,因此,函数的入栈指令及返回指令均不再需要,而只需将被内联函数的函数体中的实现某种功能的语句嵌入内联函数的函数体内即可。
[0121] 本发明实施例中,服务端设备生成的等价于第三函数的等价代码段为:
[0122]
[0123]
[0124] 由于服务端设备执行该等价代码段的效果与执行第三函数的效果相同,因此,可以看出,上述等价代码段中,内联函数对与内联函数进行函数内联的被内联函数有一个直接的函数调用,从而,可通过将进行了函数内联后的第三函数逆向为进行函数内联之前的函数调用,以生成相应的等价代码段。
[0125] S103、服务端设备获取用于存放内联函数及被内联函数的地址。
[0126] 在计算机领域内,所有的程序均是在内存中运行的,内存也被称为内存储器,其作用是用于暂时存放CPU(Central Processing Unit,中央处理器)中的运算数据,以及与硬盘等外部存储器交换的数据。只要计算机在运行中,CPU就会把需要运算的数据调到内存中进行运算,当运算完成后CPU再将结果传送出来,内存的运行也决定了计算机的稳定运行。
[0127] 程序在内存中运行时,程序在内存中都有相应的存放地址,即物理地址,相应的,每个程序中的各个函数或代码段也有各自相应的存放地址,即程序中的各个函数或代码段均有各自对应的物理地址。
[0128] 具体地,在编译源代码的过程中,服务端设备获取内存中用于存放内联函数及被内联函数的地址,即内联函数和被内联函数在内存中的物理地址,以确定内联函数及被内联函数在内存中所在的位置
[0129] 需要说明的是,本发明实施例不限制S102与S103的执行时间顺序,即本发明的实施例可以先执行S102后执行S103,也可以先执行S103后执行S102,还可以同时执行S102与S103。
[0130] S104、服务端设备获取用于修复被内联函数的第一修复函数。
[0131] 若需修复被内联函数,即需修复被调用函数,服务端设备则需首先获取用于修复被内联函数的第一修复函数。
[0132] 需要说明的是,第一修复函数为软件开发人员根据被内联函数及被内联函数的问题或漏洞重新编写的用于替补被内联函数的函数。例如,若被内联函数中的某个语句出错,软件开发人员则需根据被内联函数及被内联函数中的该语句重新编写一个包括对该语句进行修改后的正确语句的第一修复函数,以用来对被内联函数进行修复。
[0133] S105、服务端设备根据该地址,将等价代码段中的被内联函数替换为第一修复函数,以生成补丁文件。
[0134] 服务端设备根据内联函数及被内联函数的存放地址,将等价代码段中的被内联函数替换为第一修复函数,以生成相应的补丁文件。
[0135] S106、服务端设备输出该地址及补丁文件至用户端设备,以使用户端设备根据该地址及补丁文件修复被内联函数。
[0136] 用户端设备也称为客户端设备,它与服务端设备相对应,用来接收服务端设备的信息,且为用户提供相应的服务。
[0137] 服务端设备将用于存放应用程序中内联函数及被内联函数的地址,以及补丁文件进行压缩后形成压缩包,并将该压缩包输出至用户端设备,以使用户端设备可在不停止应用程序运行的情况下,根据该地址及补丁文件修复被内联函数,从而修复运行在用户端设备上的应用程序,进而实现对应用程序打热补丁的过程。
[0138] 本发明实施例还提供一种打补丁的方法,应用于对被内联函数打补丁的场景,即对应于对被调用函数打补丁的过程,该方法涉及用户端设备,如图2所示,包括:
[0139] S201、用户端设备接收来自服务端设备的地址及补丁文件。
[0140] 应用程序的源代码均是以函数为单位的,若运行在用户端设备的应用程序需要修复,则实际上是以函数为单位来进行修复的,也就是说,通过对出现漏洞或需要更新的函数进行修复,从而达到对该应用程序进行修复的目的。
[0141] 示例性的,用户端设备接收来自服务端设备的地址及补丁文件,其中,该地址为服务端设备获取的用于存放内联函数及被内联函数的地址,即为内联函数及被内联函数在内存中的物理地址;补丁文件为服务端设备将内联函数与被内联函数进行函数内联,以生成第三函数,并根据第三函数,生成等价于第三函数的等价代码段,且获取用于存放内联函数及被内联函数的地址,以及获取用于修复被内联函数的第一修复函数后,服务端设备根据该地址,将等价代码段中的被内联函数替换为第一修复函数生成的。
[0142] S202、用户端设备根据该地址及补丁文件修复被内联函数。
[0143] 用户端设备接收到来自服务端设备的该地址及补丁文件的压缩包后,首先解压该压缩包,然后,用户端设备可在不停止应用程序运行的情况下,根据该地址及补丁文件修复被内联函数,从而修复运行在用户端设备的应用程序,即实现对应用程序打热补丁的过程。
[0144] 本发明实施例提供一种补丁的生成方法及打补丁的方法,通过将内联函数与被内联函数进行函数内联,以生成第三函数,并根据第三函数,生成等价于第三函数的等价代码段,且获取用于存放内联函数及被内联函数的地址,以及获取用于修复被内联函数的第一修复函数,从而根据该地址,将等价代码段中的被内联函数替换为第一修复函数,以生成补丁文件,进而输出该地址及补丁文件至用户端设备,以使用户端设备根据该地址及补丁文件修复被内联函数。通过该方案,若需对应用程序中经过函数内联的被内联函数进行修复或更新,软件开发人员则可以只重新编写需要修复或更新的被内联函数,同时通过在编译过程中生成相应的等价代码段,从而实现对被内联函数的修复或更新,能够在函数内联优化与热补丁共存的同时,快速地修复经过函数内联的应用程序。
[0145] 本发明实施例还提供一种补丁的生成方法,应用于对内联函数打补丁的场景,即对应于对调用函数打补丁的过程,涉及服务端设备,如图3所示,包括:
[0146] S301、服务端设备保存用于与内联函数进行函数内联的被内联函数的函数体。
[0147] 在对源代码进行编译的过程中,服务端设备往往会将源代码中的某些调用函数与被调用函数进行函数内联,即将被调用函数的函数体直接嵌入到调用函数的函数体中,以提高编译后代码的性能,然而,在将调用函数与被调用函数进行函数内联时,服务端设备并没有保留被内联函数(被调用函数)的过多信息,即服务端设备在将两个函数进行函数内联后,可能会将被内联函数的函数体删除,以节省存储空间。
[0148] 在对源代码编译时,也就是在内联函数对被内联函数进行函数内联后,由于被内联函数的函数体已经嵌入了内联函数的函数体内,因此,服务端设备可能会删除被内联函数的函数体。本发明实施例中,在对源代码进行编译时,服务端设备则会保存用于与内联函数进行函数内联的被内联函数的函数体。
[0149] 本领域普通技术人员可以理解,若被内联函数为:
[0150]
[0151] 则被内联函数的函数体为:
[0152]
[0153] S302、服务端设备获取用于存放内联函数及被内联函数的地址。
[0154] 在编译源代码的过程中,服务端设备获取内存中用于存放内联函数及被内联函数的地址,即内联函数和被内联函数在内存中的物理地址,以用来确定内联函数及被内联函数在内存中所在的位置。
[0155] 需要说明的是,本发明实施例不限制S301与S302的执行时间顺序,即本发明的实施例可以先执行S301后执行S302,也可以先执行S302后执行S301,还可以同时执行S301与S302。
[0156] S303、服务端设备获取用于修复内联函数的第二修复函数。
[0157] 若需修复内联函数,也就是调用函数,服务端设备则首先需获取用于修复内联函数的第二修复函数。
[0158] 需要说明的是,第二修复函数为软件开发人员根据内联函数及内联函数的问题或漏洞重新编写的用于替补内联函数的一个函数。例如,若内联函数中的某个语句出错,软件开发人员则需根据内联函数及内联函数中的该语句重新编写一个包括对该语句进行修改后的正确语句的第二修复函数,以用来对内联函数进行修复。
[0159] S304、服务端设备根据该地址,将被内联函数的函数体与第二修复函数结合,以生成补丁文件。
[0160] 服务端设备根据内联函数及被内联函数的存放地址,将被内联函数的函数体与第二修复函数相结合,以生成相应的补丁文件。
[0161] S305、服务端设备输出该地址及补丁文件至用户端设备,以使用户端设备根据该地址及补丁文件修复内联函数。
[0162] 服务端设备将用于存放应用程序中内联函数及被内联函数的地址,以及补丁文件进行压缩后形成压缩包,并将该压缩包输出至用户端设备,以使用户端设备可在不停止应用程序运行的情况下,根据该地址及补丁文件修复内联函数,从而修复运行在用户端设备上的应用程序,即实现对应用程序打热补丁的过程。
[0163] 本发明实施例还提供一种打补丁的方法,应用于对内联函数打补丁的场景,即对应于对调用函数打补丁的过程,该方法涉及用户端设备,如图4所示,包括:
[0164] S401、用户端设备接收来自服务端设备的地址及补丁文件。
[0165] 示例性的,用户端设备接收来自服务端设备的地址及补丁文件,其中,该地址为服务端设备获取的用于存放内联函数及被内联函数的地址,即为内联函数及被内联函数在内存中的物理地址;补丁文件为服务端设备保存用于与内联函数进行函数内联的被内联函数的函数体,并获取用于存放内联函数及被内联函数的地址,以及获取用于修复内联函数的第二修复函数后,服务端设备根据该地址,将被内联函数的函数体与第二修复函数结合生成的。
[0166] S402、用户端设备根据该地址及补丁文件修复内联函数。
[0167] 用户端设备接收到来自服务端设备的该地址及补丁文件的压缩包后,首先解压该压缩包,然后,用户端设备可在不停止应用程序运行的情况下,根据该地址及补丁文件修复内联函数,从而修复运行在用户端设备的应用程序,即实现对应用程序打热补丁的过程。
[0168] 本发明实施例提供一种补丁的生成方法及打补丁的方法,通过保存用于与内联函数进行函数内联的被内联函数的函数体,并获取用于存放内联函数及被内联函数的地址,以及获取用于修复内联函数的第二修复函数,从而根据该地址,将被内联函数的函数体与第二修复函数结合,以生成补丁文件,进而输出该地址及补丁文件至用户端设备,以使用户端设备根据该地址及补丁文件修复内联函数。通过该方案,若需对应用程序中经过函数内联的内联函数进行修复或更新,软件开发人员则可以只重新编写需要修复或更新的内联函数,同时通过在编译过程中保存被内联函数的函数体,从而实现对内联函数的修复或更新,能够在函数内联优化与热补丁共存的同时,快速地修复经过函数内联的应用程序。。
[0169] 实施例二
[0170] 本发明实施例提供一种补丁的生成方法及打补丁的方法,应用于对被内联函数打补丁的场景,即对应于对被调用函数打补丁的过程,如图5所示,包括:
[0171] S501、在编译过程中,服务端设备将内联函数与被内联函数进行函数内联,以生成第三函数。
[0172] 服务端设备是为用户端设备服务的,服务的内容诸如向用户端设备提供资源,保存用户端设备的数据等。本发明实施例中的服务端设备通过获取软件开发人员提供的对某些函数进行修改后的函数,生成对应于该修改后的函数的补丁文件,并向用户端设备提供该补丁文件,以用来修复该某些函数,即对该某些函数打补丁。
[0173] 一个应用程序的源代码包括多个函数,若该应用程序出现漏洞或需要更新,则可以以函数为单位来对该应用程序进行修复或更新,也就是说,可以通过修复相应的出现漏洞或需要更新的函数,进而修复该应用程序。
[0174] 其中,“函数”为表示每个输入值对应唯一输出值的一种对应关系。在计算机领域内,函数的语句用于完成某些有意义的工作——通常是处理文本,控制输入或计算数值等。在编写程序代码时,软件开发人员通过在程序代码中引入函数名称和所需的参数,可使得系统在执行该程序代码时相应地执行(或称调用)该函数。
[0175] 在对源代码进行编译的过程中,服务端设备往往会将源代码中的调用函数与被调用函数进行函数内联,即将被调用函数的函数体直接嵌入到调用函数的函数体中,以提高编译后代码的性能。
[0176] 本发明实施例中,内联函数与被内联函数之间为函数调用的关系,且内联函数调用被内联函数,即被内联函数为被调用函数,内联函数为调用函数,这样,在编译源代码的过程中,服务端设备往往会将内联函数与被内联函数进行函数内联,以生成第三函数。
[0177] S502、服务端设备根据第三函数,确定内联函数对被内联函数进行函数调用的调用关系。
[0178] 函数调用为计算机编程或运行时,使用某个函数来完成相关的命令。在程序中,通过对函数的调用来执行被调用函数的函数体,从而实现相应的功能。
[0179] 由于第三函数为内联函数对被内联函数进行函数内联后的函数,因此,服务端设备可根据第三函数,确定内联函数与被内联函数之间的函数调用关系,即确定内联函数对被内联函数进行函数调用的调用关系。
[0180] S503、服务端设备根据调用关系,生成等价于第三函数的等价代码段。
[0181] 服务端设备确定了内联函数与被内联函数之间的函数调用关系后,服务端设备根据该调用关系,生成等价于第三函数的等价代码段。
[0182] 特别的,等价代码段可以保存于ELF文件中,也可以保存于其他任意满足要求的文件中,本发明不做限制。
[0183] 需要说明的是,等价代码段的原理为将内联函数对被内联函数进行函数内联后的第三函数逆向为内联函数对被内联函数进行函数调用的代码段。
[0184] 例如,若内联函数为:
[0185] test()
[0186] {
[0187] func();
[0188] }
[0189] 被内联函数为:
[0190]
[0191] 那么,将内联函数与被内联函数进行函数内联,即内联函数对被内联函数进行函数内联后所得的第三函数为:
[0192]
[0193]
[0194] 需要说明的是,被内联函数中的“push %ebp;mov%esp,ebp;”语句为函数的入栈指令,“leave;ret;”语句为执行完被内联函数后的返回指令,由于内联函数对被内联函数进行了函数内联,即将被内联函数的函数体嵌入到内联函数的函数体内,因此,函数的入栈指令及返回指令均不再需要,而只需将被内联函数的函数体中的实现某种功能的语句嵌入内联函数的函数体内即可。
[0195] 本发明实施例中,服务端设备生成的等价于第三函数的等价代码段为:
[0196]
[0197] 由于服务端设备执行该等价代码段的效果与执行第三函数的效果是相同的,因此,可以看出,上述等价代码段中,内联函数对与内联函数进行函数内联的被内联函数有一个直接的函数调用,从而,可通过将进行了函数内联后的第三函数逆向为进行函数内联之前的函数调用,以生成相应的等价代码段。
[0198] S504、服务端设备获取用于存放内联函数及被内联函数的地址。
[0199] 在计算机领域内,所有的程序均是在内存中运行的,内存也被称为内存储器,其作用是用于暂时存放CPU(Central Processing Unit,中央处理器)中的运算数据,以及与硬盘等外部存储器交换的数据。只要计算机在运行中,CPU就会把需要运算的数据调到内存中进行运算,当运算完成后CPU再将结果传送出来,内存的运行也决定了计算机的稳定运行。
[0200] 程序在内存中运行时,程序在内存中都有相应的存放地址,即物理地址,相应的,每个程序中的各个函数或代码段也有各自相应的存放地址,即程序中的各个函数或代码段均有各自对应的物理地址。
[0201] 在编译源代码的过程中,服务端设备获取内存中用于存放内联函数及被内联函数的地址,即内联函数和被内联函数在内存中的物理地址,以用来确定内联函数及被内联函数在内存中所在的位置。
[0202] 需要说明的是,本发明实施例不限制S502-S503与S504的执行时间顺序,即本发明的实施例可以先执行S502-S503后执行S504,也可以先执行S504后执行S502-S503,还可以同时执行S502-S503与S504。
[0203] S505、服务端设备获取用于修复被内联函数的第一修复函数。
[0204] 若需修复被内联函数,即被调用函数,服务端设备则需首先获取用于修复被内联函数的第一修复函数。
[0205] 需要说明的是,第一修复函数为软件开发人员根据被内联函数及被内联函数的问题或漏洞重新编写的用于替补被内联函数的函数。例如,若被内联函数中的某个语句出错,软件开发人员则需根据被内联函数及被内联函数中的该语句重新编写一个包括对该语句进行修改后的正确语句的第一修复函数,以用来修复被内联函数。
[0206] S506、服务端设备根据该地址,将等价代码段中的被内联函数替换为第一修复函数,以生成补丁文件。
[0207] 服务端设备根据内联函数及被内联函数的存放地址,将等价代码段中的被内联函数替换为第一修复函数,以生成相应的补丁文件。
[0208] S507、服务端设备输出该地址及补丁文件至用户端设备。
[0209] 用户端设备也称为客户端,它与服务端设备相对应,用来接收服务端设备的信息,且为用户提供相应的服务。
[0210] 服务端设备将用于存放应用程序中内联函数及被内联函数的地址,以及补丁文件进行压缩后形成压缩包,并将该压缩包输出至用户端设备,以使用户端设备可根据该地址及补丁文件修复被内联函数。
[0211] S508、用户端设备根据该地址,将被内联函数的代码修改为跳转指令。
[0212] 用户端设备接收到来自服务端设备的压缩包后,首先解压该压缩包,然后,用户端设备根据该压缩包中的用于存放内联函数及被内联函数的地址,将运行于用户端设备的应用程序中的被内联函数的代码修改为一条跳转指令jmp,如:
[0213] test()
[0214] {
[0215] jmp;
[0216] }
[0217] S509、用户端设备根据跳转指令,执行补丁文件,以修复被内联函数。
[0218] 应用程序的源代码均是以函数为单位的,若运行在用户端设备的应用程序需要修复或更新,则实际上是以函数为单位来进行修复或更新的,也就是说,通过对出现漏洞或需要更新的函数进行修复,从而达到对该应用程序进行修复的目的。
[0219] 示例性的,如图6所示,若需对运行在用户端设备的应用程序中的被内联函数打补丁,则当用户端设备执行至被内联函数时,用户端设备则根据被内联函数处的跳转指令跳转至等价代码段的开始处开始执行,在执行等价代码段的过程中,根据等价代码段中的调用指令“call func”转去执行用于修复被内联函数的第一修复函数,执行完第一修复函数后,再返回至等价代码段中的调用指令后,通过执行等价代码段中的跳转指令再返回至被内联函数处,继续执行被内联函数处的跳转指令后的其他指令,进而继续运行该应用程序。
[0220] 这样,用户端设备可在不停止应用程序运行的情况下,根据该地址及相应的补丁文件对被内联函数进行修复,从而修复运行在用户端设备的应用程序,即实现对应用程序打热补丁的过程。
[0221] 本发明实施例提供一种补丁的生成方法及打补丁的方法,通过将内联函数与被内联函数进行函数内联,以生成第三函数,并根据第三函数,生成等价于第三函数的等价代码段,且获取用于存放内联函数及被内联函数的地址,以及获取用于修复被内联函数的第一修复函数,从而根据该地址,将等价代码段中的被内联函数替换为第一修复函数,以生成补丁文件,进而输出该地址及补丁文件至用户端设备,以使用户端设备根据该地址及补丁文件修复被内联函数。通过该方案,若需对应用程序中经过函数内联的被内联函数进行修复或更新,软件开发人员则可以只重新编写需要修复或更新的被内联函数,同时通过在编译过程中生成相应的等价代码段,从而实现对被内联函数的修复或更新,能够在函数内联优化与热补丁共存的同时,快速地修复经过函数内联的应用程序。
[0222] 本发明实施例还提供一种补丁的生成方法及打补丁的方法,应用于对内联函数打补丁的场景,即对应于对调用函数打补丁的过程,如图7所示,包括:
[0223] S601、在编译过程中,服务端设备保存用于与内联函数进行函数内联的被内联函数的函数体。
[0224] 在对源代码进行编译过程中,服务端设备往往会将源代码中的调用函数与被调用函数进行函数内联,即将被调用函数的函数体直接嵌入到调用函数的函数体中,以提高编译后代码的性能,然而,在将调用函数与被调用函数进行函数内联时,服务端设备并没有保留被内联函数(也就是被调用函数)的太多信息,即服务端设备在将两个函数进行函数内联后,可能会将被内联函数的函数体删除,以用来节省存储空间。
[0225] 本发明实施例中,内联函数与被内联函数之间为函数调用的关系,且内联函数调用被内联函数,即被内联函数为被调用函数,内联函数为调用函数,这样,在编译源代码的过程中,服务端设备往往会将内联函数与被内联函数进行函数内联。
[0226] 在对源代码进行编译时,也就是在内联函数对被内联函数进行函数内联后,由于被内联函数的函数体已经嵌入了内联函数的函数体内,因此,服务端设备可能会删除被内联函数的函数体。本发明实施例中,在对源代码进行编译时,服务端设备首先保存用于与内联函数进行函数内联的被内联函数的函数体。
[0227] 特别的,被内联函数的函数体可以保存于ELF文件中,也可以保存于其他任意满足要求的文件中,本发明不做限制。
[0228] 需要说明的是,上述对被内联函数打补丁时生成的等价代码段与对内联函数打补丁时保存的被内联函数的函数体,可以同时存放在ELF文件的一个段中,也可以分别存在于ELF文件的不同段中,本发明不做限制。
[0229] 本领域普通技术人员可以理解,若被内联函数为:
[0230]
[0231] 则被内联函数的函数体为:
[0232]
[0233]
[0234] S602、服务端设备获取用于存放内联函数及被内联函数的地址。
[0235] 在编译源代码的过程中,服务端设备获取内存中用于存放内联函数及被内联函数的地址,即内联函数和被内联函数在内存中的物理地址,以用来确定内联函数及被内联函数在内存中所在的位置。
[0236] 需要说明的是,本发明实施例不限制S601与S602的执行时间顺序,即本发明的实施例可以先执行S601后执行S602,也可以先执行S602后执行S601,还可以同时执行S601与S602。
[0237] S603、服务端设备获取用于修复内联函数的第二修复函数。
[0238] 若需修复内联函数,也就是调用函数,服务端设备则首先需获取用于修复内联函数的第二修复函数。
[0239] 需要说明的是,第二修复函数为软件开发人员根据内联函数及内联函数的问题或漏洞重新编写的用于替补内联函数的一个函数。例如,若内联函数中的某个语句出错,软件开发人员则需根据内联函数及内联函数中的该语句重新编写一个包括对该语句进行修改后的正确语句的第二修复函数,以用来对内联函数进行修复。
[0240] S604、服务端设备获取函数内联关系图,函数内联关系图用于指示被内联函数的函数内联关系。
[0241] 服务端设备获取源代码编译过程中生成的内联关系图,内联关系图为用于指示被内联函数的函数内联关系,也就是被内联函数与其他函数之间的函数内联关系。
[0242] 需要说明的是,本发明实施例不限制S603与S604的执行时间顺序,即本发明的实施例可以先执行S603后执行S604,也可以先执行S604后执行S603,还可以同时执行S603与S604。
[0243] S605、服务端设备根据函数内联关系图查找是否存在被内联函数的函数体。
[0244] 服务端设备根据被内联函数的函数内联关系,在服务端设备的整个系统中查找是否存在被内联函数的函数体。
[0245] 需要说明的是,服务端设备在将内联函数与被内联函数进行函数内联后,若被内联函数未被其他函数或其他数据库调用,则服务端设备会删除被内联函数的函数体。
[0246] S606、若未查找到被内联函数的函数体,服务端设备则加载被内联函数的函数体至本地内存中。
[0247] 若服务端设备在整个系统中未查找到被内联函数的函数体,服务端设备则加载S601中保存的被内联函数的函数体至本地内存中。
[0248] 当然,若服务端设备在整个系统中查找到了被内联函数的函数体,服务端设备则可根据该被内联函数的函数体所在的地址直接调用该被内联函数。
[0249] S607、服务端设备根据该地址,将被内联函数的函数体与第二修复函数结合,以生成补丁文件。
[0250] 服务端设备根据内联函数及被内联函数的存放地址,将被内联函数的函数体与第二修复函数相结合,以生成相应的补丁文件。
[0251] S608、服务端设备输出该地址及补丁文件至用户端设备。
[0252] 服务端设备将用于存放应用程序中内联函数及被内联函数的地址,以及补丁文件进行压缩后形成压缩包,并将该压缩包输出至用户端设备,以使用户端设备可根据该地址及补丁文件修复内联函数。
[0253] S609、用户端设备根据该地址,将内联函数的代码修改为跳转指令。
[0254] 用户端设备接收到来自服务端设备的压缩包后,首先解压该压缩包,然后,用户端设备根据该压缩包中的用于存放内联函数及被内联函数的地址,将运行于用户端设备的应用程序中的内联函数的代码修改为一条跳转指令jmp,如:
[0255] test()
[0256] {
[0257] jmp;
[0258] }
[0259] S610、用户端设备根据跳转指令,执行补丁文件,以修复内联函数。
[0260] 示例性的,如图8所示,若需对运行在用户端设备的应用程序中的内联函数打补丁,则当用户端设备执行至内联函数时,用户端设备则根据内联函数处的跳转指令跳转至用于修复内联函数的第二修复函数的开始处开始执行,在执行第二修复函数的过程中,根据第二修复函数中的调用指令“call func”转去执行被内联函数的函数体,执行完被内联函数的函数体后,再返回至第二修复函数中,通过执行第二修复函数中的跳转指令再返回至内联函数处,继续执行内联函数处的跳转指令后的其他指令,进而继续运行该应用程序。
[0261] 这样,用户端设备可在不停止应用程序运行的情况下,根据该地址及相应的补丁文件修复内联函数,从而修复运行在用户端设备的应用程序,即实现对应用程序打热补丁的过程。
[0262] 本发明实施例提供一种补丁的生成方法及打补丁的方法,通过保存用于与内联函数进行函数内联的被内联函数的函数体,并获取用于存放内联函数及被内联函数的地址,以及获取用于修复内联函数的第二修复函数,从而根据上述地址,将被内联函数的函数体与第二修复函数结合,以生成补丁文件,进而输出该地址及补丁文件至用户端设备,以使用户端设备根据该地址及补丁文件修复内联函数。通过该方案,若需对应用程序中经过函数内联的内联函数进行修复或更新,软件开发人员则可以只重新编写需要修复或更新的内联函数,同时通过在编译过程中保存被内联函数的函数体,从而实现对内联函数的修复或更新,能够在函数内联优化与热补丁共存的同时,快速地修复经过函数内联的应用程序。
[0263] 实施例三
[0264] 如图9所示,本发明实施例提供一种服务端设备1,应用于对被内联函数打补丁的场景,即对应于对被调用函数打补丁的方法,包括:
[0265] 第一处理单元10,用于根据将内联函数与被内联函数进行函数内联,以生成第三函数,并根据所述第三函数,生成等价于所述第三函数的等价代码段。
[0266] 第一获取单元11,用于获取用于存放所述内联函数及所述被内联函数的地址,以及获取用于修复所述被内联函数的第一修复函数。
[0267] 所述第一处理单元10,还用于根据所述地址,将所述等价代码段中的所述被内联函数替换为所述第一修复函数,以生成补丁文件。
[0268] 第一输出单元12,用于输出所述地址及所述补丁文件至用户端设备,以使所述用户端设备根据所述地址及所述补丁文件修复所述被内联函数。
[0269] 进一步地,所述第一处理单元10,具体用于根据所述第三函数,确定所述内联函数对所述被内联函数进行函数调用的调用关系,以及根据所述调用关系,生成所述等价代码段。
[0270] 进一步地,所述等价代码段可以保存于ELF文件中。
[0271] 需要说明的是,等价代码段可以保存于ELF文件中,也可以保存于其他任意满足要求的文件中,本发明不做限制。
[0272] 如图10所示,本发明实施例提供一种用户端设备2,应用于对被内联函数打补丁的场景,即对应于对被调用函数打补丁的方法,包括:
[0273] 第二接收单元20,用于接收来自服务端设备的地址及补丁文件,其中,所述地址为所述服务端设备获取的用于存放内联函数及所述被内联函数的地址,
[0274] 所述补丁文件为所述服务端设备将所述内联函数与所述被内联函数进行函数内联,以生成第三函数,并根据所述第三函数,生成等价于所述第三函数的等价代码段,且获取用于存放所述内联函数及所述被内联函数的地址,以及获取用于修复所述被内联函数的第一修复函数后,所述服务端设备根据所述地址,将所述等价代码段中的所述被内联函数替换为所述第一修复函数生成的。
[0275] 第二处理单元21,用于根据所述地址及所述补丁文件修复所述被内联函数。
[0276] 进一步地,所述第二处理单元21,具体用于根据所述地址,将所述被内联函数的代码修改为跳转指令,所述跳转指令用于指示所述补丁文件的起始地址,以及根据所述跳转指令,执行所述补丁文件,以修复所述被内联函数。
[0277] 进一步地,所述等价代码段可以保存于ELF文件中。
[0278] 本发明实施例提供一种服务端设备及用户端设备,服务端设备将内联函数与被内联函数进行函数内联,以生成第三函数,并根据第三函数,生成等价于第三函数的等价代码段,且获取用于存放内联函数及被内联函数的地址,以及获取用于修复被内联函数的第一修复函数后,从而服务端设备根据上述地址,将等价代码段中的被内联函数替换为第一修复函数,以生成补丁文件,进而输出该地址及补丁文件至用户端设备,以使用户端设备根据该地址及补丁文件修复被内联函数。通过该方案,若需对应用程序中经过函数内联的被内联函数进行修复或更新,软件开发人员则可以只重新编写需要修复或更新的被内联函数,同时通过在编译过程中生成相应的等价代码段,从而实现对被内联函数的修复或更新,能够在函数内联优化与热补丁共存的同时,快速地修复经过函数内联的应用程序。
[0279] 如图11所示,本发明实施例提供一种服务端设备1,应用于对内联函数打补丁的场景,即对应于对调用函数打补丁的方法,包括:
[0280] 第一存储单元13,用于保存用于与所述内联函数进行函数内联的被内联函数的函数体。
[0281] 第一获取单元11,用于获取用于存放所述内联函数及所述被内联函数的地址,以及获取用于修复所述内联函数的第二修复函数。
[0282] 第一处理单元10,用于根据所述地址,将所述被内联函数的函数体与所述第二修复函数结合,以生成补丁文件。
[0283] 第一输出单元12,用于输出所述地址及所述补丁文件至用户端设备,以使所述用户端设备根据所述地址及所述补丁文件修复所述内联函数。
[0284] 进一步地,所述第一获取单元11,还用于获取函数内联关系图,所述函数内联关系图用于指示所述被内联函数的函数内联关系。
[0285] 所述第一处理单元10,还用于根据所述函数内联关系图查找是否存在所述被内联函数的函数体,以及若未查找到所述被内联函数的函数体,则加载所述被内联函数的函数体至本地内存中。
[0286] 进一步地,所述被内联函数的函数体可以保存于ELF文件中。
[0287] 需要说明的是,被内联函数的函数体可以保存于ELF文件中,也可以保存于其他任意满足要求的文件中,本发明不做限制。
[0288] 如图10所示,本发明实施例提供一种用户端设备2,应用于对内联函数打补丁的场景,即对应于对调用函数打补丁的方法,包括:
[0289] 第二接收单元20,用于接收来自服务端设备的地址及补丁文件,其中,所述地址为所述服务端设备获取的用于存放所述内联函数及被内联函数的地址,
[0290] 所述补丁文件为所述服务端设备保存用于与所述内联函数进行函数内联的所述被内联函数的函数体,并获取用于存放所述内联函数及所述被内联函数的地址,以及获取用于修复所述内联函数的第二修复函数后,所述服务端设备根据所述地址,将所述被内联函数的函数体与所述第二修复函数结合生成的。
[0291] 第二处理单元21,用于根据所述地址及所述补丁文件修复所述内联函数。
[0292] 进一步地,所述第二处理单元21,具体用于根据所述地址,将所述内联函数的代码修改为跳转指令,所述跳转指令用于指示所述补丁文件的起始地址,以及根据所述跳转指令,执行所述补丁文件,以修复所述内联函数。
[0293] 进一步地,所述被内联函数的函数体可以保存于ELF文件中。
[0294] 本发明实施例提供一种服务端设备及用户端设备,服务端设备保存用于与内联函数进行函数内联的被内联函数的函数体,并获取用于存放内联函数及被内联函数的地址,以及获取用于修复内联函数的第二修复函数后,从而服务端设备根据上述地址,将被内联函数的函数体与第二修复函数结合,以生成补丁文件,进而输出该地址及补丁文件至用户端设备,以使用户端设备根据该地址及补丁文件修复内联函数。通过该方案,若需对应用程序中经过函数内联的内联函数进行修复或更新,软件开发人员则可以只重新编写需要修复或更新的内联函数,同时通过在编译过程中保存被内联函数的函数体,从而实现对内联函数的修复或更新,能够在函数内联优化与热补丁共存的同时,快速地修复经过函数内联的应用程序。
[0295] 实施例四
[0296] 如图12所示,本发明实施例提供一种服务端设备1,应用于对被内联函数打补丁的场景,即对应于对被调用函数打补丁的方法,该服务端设备1包括:至少一个第一处理器14,例如CPU,至少一个第一网络接口16或者其他第一用户接口17,第一存储器15,至少一个第一通信总线18。第一通信总线18用于实现这些组件之间的连接通信。该服务端设备
1可选的包含其他第一用户接口17,包括显示器,键盘或者点击设备(例如,鼠标轨迹球(trackball),触感板或者触感显示屏)。第一存储器15可能包含高速RAM(Random Access Memory,随机存取存储器),也可能还包括非不稳定的存储器(non-volatile memory),例如至少一个磁盘存储器。第一存储器15可选的可以包含至少一个位于远离前述第一处理器
14的存储装置。
[0297] 在一些实施方式中,第一存储器15存储了如下的元素,可执行模或者数据结构,或者他们的子集,或者他们的扩展集:
[0298] 第一操作系统150,包含各种系统程序,用于实现各种基础业务以及处理基于硬件的任务。
[0299] 第一应用模块151,包含各种应用程序,用于实现各种应用业务。
[0300] 第一应用模块151中包括但不限于编译器1510和补丁制作客户端1511。
[0301] 第一应用模块151中各模块的具体实现参见图14所示实施例中的相应模块,在此不赘述。
[0302] 具体的,首先,第一处理器14用于根据将内联函数与被内联函数进行函数内联,以生成第三函数,并根据所述第三函数,生成等价于所述第三函数的等价代码段,以及将等价代码段保存至第一存储器15中。
[0303] 然后,第一处理器14获取用于存放内联函数及被内联函数的地址,以及获取用于修复被内联函数的第一修复函数,并将该地址及第一修复函数通过第一通信总线18保存至第一存储器15中。
[0304] 接着,第一处理器14根据存储在第一存储器15中的该地址,将等价代码段中的被内联函数替换为第一修复函数,以生成相应的补丁文件。
[0305] 最后,第一处理器14在第一通信总线18上,通过第一网络接口16或第一用户接口17输出该地址及补丁文件至用户端设备,以使用户端设备根据该地址及补丁文件修复被内联函数。
[0306] 进一步地,第一处理器14,具体用于根据第三函数,确定内联函数对被内联函数进行函数调用的调用关系,以及根据该调用关系,生成相应的等价于第三函数的等价代码段。
[0307] 进一步地,等价代码段可以保存于ELF文件中。
[0308] 需要说明的是,等价代码段可以保存于ELF文件中,也可以保存于其他任意满足要求的文件中,本发明不做限制。
[0309] 如图13所示,本发明实施例提供一种用户端设备2,应用于对被内联函数打补丁的场景,即对应于对被调用函数打补丁的方法,该用户端设备2包括:至少一个第二处理器22,例如CPU,至少一个第二网络接口24或者其他第二用户接口25,第二存储器23,至少一个第二通信总线26。第二通信总线26用于实现这些组件之间的连接通信。该用户端设备
2可选的包含其他第二用户接口25,包括显示器,键盘或者点击设备(例如,鼠标,轨迹球(trackball),触感板或者触感显示屏)。第二存储器23可能包含高速RAM(Random Access Memory,随机存取存储器),也可能还包括非不稳定的存储器(non-volatile memory),例如至少一个磁盘存储器。第二存储器23可选的可以包含至少一个位于远离前述第二处理器
22的存储装置。
[0310] 在一些实施方式中,第二存储器23存储了如下的元素,可执行模块或者数据结构,或者他们的子集,或者他们的扩展集:
[0311] 第二操作系统230,包含各种系统程序,用于实现各种基础业务以及处理基于硬件的任务。
[0312] 第二应用模块231,包含各种应用程序,用于实现各种应用业务。
[0313] 第二应用模块231中包括但不限于补丁管理客户端2310。
[0314] 第二应用模块231中各模块的具体实现参见图14所示实施例中的相应模块,在此不赘述。
[0315] 具体的,在打补丁过程中,首先,第二处理器22在第二通信总线26上,通过第二网络接口24或第二用户接口25接收到来自服务端设备的地址及补丁文件,并将该地址及补丁文件通过第二通信总线26保存至第二存储器23中,其中,该地址为服务端设备获取的用于存放内联函数及被内联函数的地址,补丁文件为服务端设备将内联函数与被内联函数进行函数内联,以生成第三函数,并根据第三函数,生成等价于第三函数的等价代码段,且获取用于存放内联函数及被内联函数的地址,以及获取用于修复被内联函数的第一修复函数后,服务端设备根据地址,将等价代码段中的被内联函数替换为第一修复函数生成的。
[0316] 然后,第二处理器22通过第二通信总线26从第二存储器23内调出该地址及补丁文件,以根据该地址及补丁文件修复被内联函数。
[0317] 进一步地,第二处理器22,具体用于根据该地址,将被内联函数的代码修改为跳转指令,以及根据该跳转指令执行补丁文件,以修复被内联函数,其中,跳转指令用于指示补丁文件的起始地址。
[0318] 进一步地,等价代码段可以保存于ELF文件中。
[0319] 本发明实施例提供一种服务端设备及用户端设备,服务端设备将内联函数与被内联函数进行函数内联,以生成第三函数,并根据第三函数,生成等价于第三函数的等价代码段,且获取用于存放内联函数及被内联函数的地址,以及获取用于修复被内联函数的第一修复函数后,从而服务端设备根据上述地址,将等价代码段中的被内联函数替换为第一修复函数,以生成补丁文件,进而输出该地址及补丁文件至用户端设备,以使用户端设备根据该地址及补丁文件修复被内联函数。通过该方案,若需对应用程序中经过函数内联的被内联函数进行修复或更新,软件开发人员则可以只重新编写需要修复或更新的被内联函数,同时通过在编译过程中生成相应的等价代码段,从而实现对被内联函数的修复或更新,能够在函数内联优化与热补丁共存的同时,快速地修复经过函数内联的应用程序。
[0320] 如图12所示,本发明实施例提供一种服务端设备1,应用于对内联函数打补丁的场景,即对应于对调用函数打补丁的方法,该服务端设备1包括:至少一个第一处理器14,例如CPU,至少一个第一网络接口16或者其他第一用户接口17,第一存储器15,至少一个第一通信总线18。第一通信总线18用于实现这些组件之间的连接通信。该服务端设备1可选的包含其他第一用户接口17,包括显示器,键盘或者点击设备(例如,鼠标,轨迹球(trackball),触感板或者触感显示屏)。第一存储器15可能包含高速RAM(Random Access Memory,随机存取存储器),也可能还包括非不稳定的存储器(non-volatile memory),例如至少一个磁盘存储器。第一存储器15可选的可以包含至少一个位于远离前述第一处理器
14的存储装置。
[0321] 在一些实施方式中,第一存储器15存储了如下的元素,可执行模块或者数据结构,或者他们的子集,或者他们的扩展集:
[0322] 第一操作系统150,包含各种系统程序,用于实现各种基础业务以及处理基于硬件的任务。
[0323] 第一应用模块151,包含各种应用程序,用于实现各种应用业务。
[0324] 第一应用模块151中包括但不限于编译器1510和补丁制作客户端1511。
[0325] 第一应用模块151中各模块的具体实现参见图14所示实施例中的相应模块,在此不赘述。
[0326] 具体的,在编译过程中,首先,第一处理器14通过第一通信总线18将用于与内联函数进行函数内联的被内联函数的函数体保存至第一存储器15中。
[0327] 然后,第一处理器14获取用于存放内联函数及被内联函数的地址,以及获取用于修复内联函数的第二修复函数,并将该地址及第二修复函数通过第一通信总线18保存至第一存储器15中。
[0328] 接着,第一处理器14根据第一存储器15中存储的该地址,将被内联函数的函数体与第二修复函数结合,以生成相应的补丁文件。
[0329] 最后,第一处理器14在第一通信总线18上,通过第一网络接口16或第一用户接口17输出该地址及补丁文件至用户端设备,以使用户端设备根据该地址及补丁文件修复内联函数。
[0330] 进一步地,第一处理器14,还用于获取函数内联关系图,并将函数内联关系图通过第一通信总线18保存至第一存储器15中,以及调出第一存储器15中保存的函数内联关系图,并根据该函数内联关系图在服务端设备的整个系统中查找是否存在被内联函数的函数体,以及若未查找到被内联函数的函数体,第一处理器14则加载被内联函数的函数体至本地内存中,其中,函数内联关系图用于指示被内联函数的函数内联关系。
[0331] 进一步地,被内联函数的函数体可以保存于ELF文件中。
[0332] 需要说明的是,被内联函数的函数体可以保存于ELF文件中,也可以保存于其他任意满足要求的文件中,本发明不做限制。
[0333] 如图13所示,本发明实施例提供一种用户端设备2,应用于对内联函数打补丁的场景,即对应于对调用函数打补丁的方法,该用户端设备2包括:至少一个第二处理器22,例如CPU,至少一个第二网络接口24或者其他第二用户接口25,第二存储器23,至少一个第二通信总线26。第二通信总线26用于实现这些组件之间的连接通信。该用户端设备2可选的包含其他第二用户接口25,包括显示器,键盘或者点击设备(例如,鼠标,轨迹球(trackball),触感板或者触感显示屏)。第二存储器23可能包含高速RAM(Random Access Memory,随机存取存储器),也可能还包括非不稳定的存储器(non-volatile memory),例如至少一个磁盘存储器。第二存储器23可选的可以包含至少一个位于远离前述第二处理器
22的存储装置。
[0334] 在一些实施方式中,第二存储器23存储了如下的元素,可执行模块或者数据结构,或者他们的子集,或者他们的扩展集:
[0335] 第二操作系统230,包含各种系统程序,用于实现各种基础业务以及处理基于硬件的任务。
[0336] 第二应用模块231,包含各种应用程序,用于实现各种应用业务。
[0337] 第二应用模块231中包括但不限于补丁管理客户端2310。
[0338] 第二应用模块231中各模块的具体实现参见图14所示实施例中的相应模块,在此不赘述。
[0339] 具体的,在打补丁过程中,首先,第二处理器22在第二通信总线26上,通过第二网络接口24或第二用户接口25接收来自服务端设备的地址及补丁文件,并将该地址及补丁文件通过第二通信总线26保存至第二存储器23中,其中,该地址为服务端设备获取的用于存放内联函数及被内联函数的地址,补丁文件为服务端设备保存用于与内联函数进行函数内联的被内联函数的函数体,并获取用于存放内联函数及被内联函数的地址,以及获取用于修复内联函数的第二修复函数后,服务端设备根据该地址,将被内联函数的函数体与第二修复函数结合生成的。
[0340] 然后,第二处理器22通过第二通信总线26从存储器23中调出该地址及补丁文件,并根据该地址及补丁文件修复内联函数。
[0341] 进一步地,第二处理器22,具体用于通过第二通信总线26调出第二存储器23中保存的该地址,并根据该地址,将内联函数的代码修改为跳转指令,以及根据跳转指令,执行补丁文件,以修复内联函数,其中,跳转指令用于指示补丁文件的起始地址。
[0342] 进一步地,被内联函数的函数体可以保存于ELF文件中。
[0343] 本发明实施例提供一种服务端设备及用户端设备,服务端设备保存用于与内联函数进行函数内联的被内联函数的函数体,并获取用于存放内联函数及被内联函数的地址,以及获取用于修复内联函数的第二修复函数后,从而服务端设备根据上述地址,将被内联函数的函数体与第二修复函数结合,以生成补丁文件,进而输出该地址及补丁文件至用户端设备,以使用户端设备根据该地址及补丁文件修复内联函数。通过该方案,若需对应用程序中经过函数内联的内联函数进行修复或更新,软件开发人员则可以只重新编写需要修复或更新的内联函数,同时通过在编译过程中保存被内联函数的函数体,从而实现对内联函数的修复或更新,能够在函数内联优化与热补丁共存的同时,快速地修复经过函数内联的应用程序。
[0344] 实施例五
[0345] 上述实施例提供的一种补丁的生成方法、打补丁的方法及装置,均是从硬件执行度来进行说明的,下面再从软件执行角度,结合本发明实施例提供的一种补丁的生成方法及打补丁的方法,以及运行在本发明实施例提供的服务端设备和用户端设备上的客户端,对本发明实施例提供的补丁的实现系统进行详细地说明。
[0346] 本领域普通技术人员可以理解,本发明实施例提供的一种补丁的生成方法及打补丁的方法,需通过硬件装置执行相应的软件程序及指令才能实现。
[0347] 如图14所示,本发明实施例提供的一种补丁的实现系统3,包括编译器1510、补丁制作客户端1511以及补丁管理客户端2310,其中,编译器1510、补丁制作客户端1511对应于本发明实施例提供的服务端设备1,补丁管理客户端2310对应于本发明实施例提供的用户端设备2,应当理解的是,编译器1510和补丁制作客户端1511均运行在服务端设备1,补丁管理客户端2310运行在用户端设备2。需要说明的是,图14所示的系统中示意性的包括一个用户端设备,应当理解的是,本发明实施例的系统可以包括一个或多个用户端设备。
[0348] 编译器为可以将“高级语言”翻译为“机器语言(低级语言)”的一个应用程序。一个现代编译器的主要工作流程为:源代码(source code)→预处理器(preprocessor)→编译器(compiler)→汇编程序(assembler)→目标代码(object code)→链接器(Linker)→可执行程序(executables),即软件开发人员编写的源代码,经过编译器的一系列处理,最终经过编译链接后生成可执行程序,以供计算机执行。
[0349] 本发明实施例提供的一种补丁的实现系统3可应用于通信网络中,优选的,可应用于通信网络中业务不能中断的设备中运行的应用程序的修复。具体的,以通信网络中的路由器为例,若路由器传输的数据格式进行了调整、路由器对传输数据的统计不精确或者路由器的内存不能正常释放,则为了兼容新的数据格式、对数据统计的更精确或者使得路由器的内存可以正常释放,需对路由器的相关应用程序(假设应用程序中存在函数内联的情况)进行修复,即可通过对应用程序中的相关函数(内联函数和/或被内联函数)打补丁,以修复该应用程序,进而兼容新的数据格式、使得路由器对数据的统计更精确或者路由器的内存可正常释放。
[0350] 示例性的,以路由器需兼容新的数据格式为例,对应于本发明实施例提供的一种补丁的生成方法及打补丁的方法,对应用程序中的被内联函数,即被调用函数实现打补丁的步骤为:
[0351] (1)在对应用程序的源代码进行编译时,由于内联函数与被内联函数之间为函数调用关系,且内联函数调用被内联函数,即被内联函数为被调用函数,内联函数为调用函数,编译器1510则将内联函数与被内联函数进行函数内联,以生成第三函数。
[0352] (2)编译器1510根据内联函数对被内联函数进行函数内联后的第三函数,生成等价于第三函数的等价代码段,并将等价代码段保存至相应的文件中。
[0353] (3)编译器1510输出内联函数及被内联函数在内存中的存放地址,并将该地址存放在相应的文件中。
[0354] (4)当补丁制作客户端1511制作补丁文件时,补丁制作客户端1511加载软件开发人员提供的用于修复被内联函数的第一修复函数、等价代码段以及编译器1510输出的用于存放内联函数及被内联函数的地址。
[0355] (5)补丁制作客户端1511根据该地址,将等价代码段中的被内联函数替换为第一修复函数,以生成对应于第一修复函数的补丁文件。
[0356] (6)当补丁管理客户端2310对某些应用程序中的被内联函数打补丁时,如图6所示,补丁管理客户端2310根据编译器1510输出的用于存放内联函数及被内联函数的地址,将被内联函数的代码修改为跳转指令,从而系统在执行被内联函数时,若执行到跳转指令,则将跳转至等价代码段的开始处开始执行,在执行等价代码段的过程中,系统将根据等价代码段中的调用指令“call func”调用第一修复函数,即系统将转去执行第一修复函数,执行完第一修复函数后,再返回至等价代码段中的调用指令后,通过执行等价代码段中的跳转指令再返回至被内联函数处,继续执行跳转指令后的其他指令,进而继续运行该应用程序。
[0357] 至此,完成了对被调用函数打补丁的过程。
[0358] 结合本发明实施例提供的一种补丁的生成方法及打补丁的方法,本发明实施例提供的一种补丁的实现系统3,通过在编译过程中,编译器1510生成等价代码段,以及保存内联函数及被内联函数的存放地址;在补丁制作过程中,补丁制作客户端1511根据上述地址,将等价代码段中的被内联函数替换为软件开发人员提供的第一修复函数,以生成对应于第一修复函数的补丁文件;在打补丁的过程中,补丁管理客户端2310根据上述地址将被内联函数的代码修改为一条跳转指令,从而,使得用户端设备的系统在执行被内联函数时,根据相应的跳转指令转去执行相应的等价代码段和第一修复函数,进而实现对被内联函数打补丁,即实现对被内联函数的修复。
[0359] 示例性的,以路由器需兼容新的数据格式为例,对应于本发明实施例提供的一种补丁的生成方法及打补丁的方法,对应用程序中的内联函数,即调用函数实现打补丁的步骤为:
[0360] (1)在对应用程序的源代码进行编译时,由于内联函数与被内联函数之间为函数调用关系,且内联函数调用被内联函数,即被内联函数为被调用函数,内联函数为调用函数,编译器1510则将内联函数与被内联函数进行函数内联。
[0361] (2)编译器1510保存用于与内联函数进行函数内联的被内联函数的函数体。
[0362] (3)编译器1510输出内联函数及被内联函数在内存中的存放地址,以及函数内联关系图,并将该地址及函数内联关系图保存至相应的文件中,内联关系图用于指示被内联函数的函数内联关系。
[0363] (4)补丁制作客户端1511根据函数内联关系图在整个服务端设备的系统中查找是否存在被内联函数的函数体,若未查找到被内联函数的函数体,补丁制作客户端1511则加载(2)中保存的被内联函数的函数体至本地内存中;若查找到被内联函数的函数体,在对内联函数打补丁时,服务端设备的系统可直接调用被内联函数的函数体。
[0364] (5)当补丁制作客户端1511制作补丁文件时,补丁制作客户端1511加载软件开发人员提供的用于修复内联函数的第二修复函数、被内联函数的函数体,以及编译器1510输出的用于存放内联函数及被内联函数的地址。
[0365] (6)补丁制作客户端1511根据用于存放内联函数及被内联函数的地址,将第二修复函数与被内联函数的函数体结合,以生成对应于第二修复函数的补丁文件。
[0366] (7)当补丁管理客户端2310对应用程序中的内联函数打补丁时,如图8所示,补丁管理客户端2310根据编译器1510输出的用于存放内联函数及被内联函数的地址,将内联函数的代码修改为跳转指令,从而系统在执行内联函数时,若执行到跳转指令,则将跳转至第二修复函数的开始处开始执行,在执行第二修复函数的过程中,系统将根据第二修复函数中的调用指令“call func”调用被内联函数的函数体,即系统将转去执行被内联函数的函数体,执行完被内联函数的函数体后,再返回至第二修复函数中,通过执行第二修复函数中的跳转指令再返回至内联函数的跳转指令后的地址,继续执行其他指令,进而继续运行该应用程序。
[0367] 至此,完成了对调用函数打补丁的过程。
[0368] 结合本发明实施例提供的一种补丁的生成方法及打补丁的方法,本发明实施例提供的一种补丁的实现系统3,通过在编译过程中,编译器1510保存用于与内联函数进行函数内联的被内联函数的函数体、内联函数及被内联函数的存放地址,以及用于指示被内联函数的函数内联关系的函数内联关系图;在补丁制作过程中,补丁制作客户端1511根据上述地址,将软件开发人员提供的第二修复函数与被内联函数的函数体结合,以生成对应于第二修复函数的补丁文件;在打补丁的过程中,补丁管理客户端2310根据上述地址将内联函数的代码修改为一条跳转指令,从而,使得用户端设备的系统在执行内联函数时,根据相应的跳转指令转去执行相应的第二修复函数,以及调用被内联函数的函数体,进而实现对内联函数打补丁的过程,即实现对内联函数的修复。
[0369] 本发明实施例提供的补丁实现系统,通过编译器在编译阶段提供函数进行函数内联的相关信息,如用于存放内联函数及被内联函数的地址、函数内联关系图、被内联函数的函数体,以及等价代码段等,使得补丁制作客户端根据上述信息,应用本发明实施例提供的补丁的生成方法,生成相应的补丁文件,从而使得补丁管理客户端根据该补丁文件及编译器提供的上述地址,对被内联函数(被调用函数)和/或内联函数(调用函数)打补丁,即对被内联函数和/或内联函数进行修复,从而解决了现有技术中无法方便地对经过函数内联的函数打热补丁,进而使得软件开发人员可以按照未进行函数内联的方法制作相应的补丁文件,即,即使函数经过了函数内联,软件开发人员也只需重新编写出现问题或漏洞的函数即可,不用重新编写进行函数内联的其他函数,以及,应用本发明实施例提供的补丁的生成方法及打补丁的方法,即可实现对相应的函数进行修复的目的,从而简化了操作,为用户端设备的应用程序及系统的快速修复提供了保障。
[0370] 所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
[0371] 在本申请所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述模块或单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
[0372] 所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
[0373] 另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
[0374] 所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)或处理器(processor)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
[0375] 以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈