补丁处理的方法和设备以及生成补丁的方法和设备的制造方法_4

文档序号:9810318阅读:来源:国知局
二函数进行更新,所述第二函数为第一函数的调用对象;
[0098]所述中间代码用于在所述第二函数跳转到所述中间代码时保存所述第一函数的表地址和所述第一调用指令的返回地址到所述预留空间以及在所述第三函数返回所述中间代码时从所述预留空间恢复所述第一函数的表地址和所述第一调用指令的返回地址,所述第一函数的表地址为所述第一函数的表结构的地址,所述第一函数的表结构用于记录所述第一函数的调用对象的地址,所述第一调用指令为所述第一函数中用于调用所述第二函数的指令;
[0099]所述预留空间用于在所述中间代码调用所述第三函数的过程中存储所述第一函数的表地址和所述第一调用指令的返回地址。
[0100]在【具体实施方式】中,所述S502例如可以包括:对所述OBJ格式的补丁文件进行所述第三函数的重定位,并在所述OBJ格式的补丁文件中添加所述预留空间。其中,所述OBJ包括所述第三函数。所述PAT文件包括所述第三函数、所述中间代码和所述预留空间。所述中间代码包括用于调用所述第三函数的第二调用指令。所述第三函数的地址可以在生成所述PAT文件时获取并添加到所述第二调用指令中,或者,所述PAT文件中可以携带有所述第三函数地址的获取指令,所述第三函数的地址也可以是所述PAT文件加载到运行有软件的设备时所述设备根据所述获取指令获取并添加到所述第二调用指令中的。
[0101]可以理解的是,所述PAT格式的补丁文件即相当于前述图2所示实施例中的补丁文件。所述补丁文件在设备上对软件的补丁方式可以参见前述图2所示的实施例,本实施例在此不再追溯。
[0102]采用本实施例生成的补丁文件对软件进行补丁,一方面,中间代码调用第三函数时丢失的第一函数的表地址,可以在执行完第三函数返回第一函数之前从预留空间恢复,因此,返回第一函数之后,在执行第一函数的过程中可以按照已恢复的表地址从第一函数的表结构中查找调用对象的地址,从而避免了从第三函数返回第一函数之后再执行第一函数时无法查找到第一函数的调用对象,避免了软件的运行出现故障,减少了软件运行出现中断的情况;另一方面,虽然中间代码调用第三函数时第一调用指令的返回地址被替换成了第二调用指令的返回地址,但在执行完第三函数返回第一函数之前可以从预留空间中恢复第一调用指令的返回地址,按照已恢复的第一调用指令的返回地址可以返回第一函数,从而避免了第三函数执行完之后无法返回第一函数继续后续指令的执行,避免了软件的运行出现故障,减少了软件运行出现中断的情况;再一方面,在补丁文件中留出预留空间来保存第一函数的表地址和第一调用指令的返回地址,所保存的表地址和返回地址不会占用栈帧结构,从而保证了第三函数的调用与第二函数的调用具有相同的栈帧结构,避免了栈帧结构改变所造成的信息获取错误,进而避免了信息获取错误导致的软件运行中断。由此可见,通过本实施例的技术方案,补丁文件对软件进行更新之后,导致软件中断运行的许多因素得以避免,因此,软件运行中断的可能性大大降低。
[0103]参见图6,示出了本发明实施例中一种补丁处理设备的结构示意图。在本实施例中,所述设备600例如具体可以包括:
[0104]第一跳转单元601,用于响应于执行到第一函数中的第一调用指令,跳转到所述第二函数;
[0105]第二跳转单元602,用于响应于执行到所述第二函数的第一条指令,跳转到补丁文件的中间代码;
[0106]保存单元603,用于按照所述中间代码的指令,将所述第一函数的表地址和所述第一调用指令的返回地址保存到所述补丁文件的预留空间,所述第一函数的表地址为所述第一函数的表结构的地址,所述第一函数的表结构用于记录所述第一函数的调用对象的地址;
[0107]第三跳转单元604,用于响应于执行到所述中间代码中的第二调用指令,跳转到所述补丁文件的第三函数,所述第三函数用于对所述第二函数进行更新;
[0108]第一返回单元605,用于响应于完成所述第三函数的执行,按照所述第二调用指令的返回地址,返回所述中间代码;
[0109]恢复单元606,用于按照所述中间代码的指令,从所述预留空间中恢复所述第一函数的表地址和所述第一调用指令的返回地址;
[0110]第二返回单元607,用于按照所述第一调用指令的返回地址,返回所述第一函数。
[0111]在本实施例的一些实施方式中,所述设备600例如还可以包括:
[0112]第一获取单元,用于获取所述补丁文件;
[0113]第二获取单元,用于按照所述补丁文件获取所述第二函数的地址;
[0114]添加单元,用于根据所述第二函数的地址,在所述第二函数中添加用于跳转到所述中间代码的指令,作为所述第二函数的第一条指令。
[0115]在本实施例的另一些实施方式中,所述设备600例如还可以包括:
[0116]监测单元,用于响应于所述返回所述第一函数,监测所述第一函数的执行是否出现故障;
[0117]删除单元,用于当监测到所述第一函数的执行出现故障时,删除所述第二函数中用于跳转到所述中间代码的第一条指令。
[0118]在本发明实施例的技术方案中,一方面,中间代码调用第三函数时丢失的第一函数的表地址,可以在执行完第三函数返回第一函数之前从预留空间恢复,因此,返回第一函数之后,在执行第一函数的过程中可以按照已恢复的表地址从第一函数的表结构中查找调用对象的地址,从而避免了从第三函数返回第一函数之后再执行第一函数时无法查找到第一函数的调用对象,避免了软件的运行出现故障,减少了软件运行出现中断的情况;另一方面,虽然中间代码调用第三函数时第一调用指令的返回地址被替换成了第二调用指令的返回地址,但在执行完第三函数返回第一函数之前可以从预留空间中恢复第一调用指令的返回地址,按照已恢复的第一调用指令的返回地址可以返回第一函数,从而避免了第三函数执行完之后无法返回第一函数继续后续指令的执行,避免了软件的运行出现故障,减少了软件运行出现中断的情况;再一方面,在补丁文件中留出预留空间来保存第一函数的表地址和第一调用指令的返回地址,所保存的表地址和返回地址不会占用栈帧结构,从而保证了第三函数的调用与第二函数的调用具有相同的栈帧结构,避免了栈帧结构改变所造成的信息获取错误,进而避免了信息获取错误导致的软件运行中断。由此可见,通过本实施例的技术方案,补丁文件对软件进行更新之后,导致软件中断运行的许多因素得以避免,因此,软件运行中断的可能性大大降低。
[0119]参见图7,示出了本发明实施例中一种生成补丁文件的设备的结构示意图。在本实施例中,所述设备700例如具体可以包括:
[0120]获取单元701,用于获取OBJ格式的补丁文件;
[0121]生成单元702,用于根据所述OBJ格式的补丁文件生成PAT格式的补丁文件;
[0122]其中,所述PAT格式的补丁文件包括第三函数、中间代码和预留空间;
[0123]所述第三函数用于对第二函数进行更新,所述第二函数为第一函数的调用对象;
[0124]所述中间代码用于在所述第二函数跳转到所述中间代码时保存所述第一函数的表地址和所述第一调用指令的返回地址到所述预留空间以及在所述第三函数返回所述中间代码时从所述预留空间恢复所述第一函数的表地址和所述第一调用指令的返回地址,所述第一函数的表地址为所述第一函数的表结构的地址,所述第一函数的表结构用于记录所述第一函数的调用对象的地址,所述第一调用指令为所述第一函数中用于调用所述第二函数的指令;
[0125]所述预留空间用于在所述中间代码调用所述第三函数的过程中存储所述第一函数的表地址和所述第一调用指令的返回地址。
[0126]可选的,所述生成单元702例如具体可以包括:
[0127]重定位子单元,用于对所述OBJ格式的补丁文件进行所述第三函数的重定位;
[0128]添加子单元,用于在所述OBJ格式的补丁文件中添加所述预留空间。
[0129]采用本实施例生成的补丁文件对软件进行补丁,一方面,中间代码调用第三函数时丢失的第一函数的表地址,可以在执行完第三函数返回第一函数之前从预留空间恢复,因此,返回第一函数之后,在执行第一函数的过程中可以按照已恢复的表地址从第一函数的表结构中查找调用对象的地址,从而避免了从第三函数返回第一函数之后再执行第一函数时无法查找到第一函数的调用对象,避免了软件的运行出现故障,减少了软件运行出现中断的情况;另一方面,虽然中间代码调用第三函数时第一调用指令的返回地址被替换成了第二调用指令的返回地址,但在执行完第三函数返回第一函数之前可以从预留空间中恢复第一调用指令的返回地址,按照已恢复的第一调用指令的返回地址可以返回第一函数,从而避免了第三函数执行完之后无法返回第一函数继续后续指令的执行,避免了软件的运行出现故障,减少了软件运行出现中断的情况;再一方面,在补丁文件中留出预留空间来保存第一函数的表地址和第一调用指令的返回地址,所保存的表地址和返回地址不会占用栈帧结构,从而保证了第三函数的调用与第二函数的调用具有相同的栈帧结构,避免了栈帧结构改变所造成的信息获取错误,进而避免了信息获取错误导致的软件运行中断。由此可见,通过本实施例的技术方案,补丁文件对软件进行更新之后,导致软件中断运行的许多因素得以避免,因此,软件运行中断的可能性大大降低。
[0130]所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的相关设备具
当前第4页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1