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

文档序号:9810318阅读:来源:国知局
结构,在所述第一函数的表结构中查找所述第一函数的调用对象的地址。所述设备根据查找到的调用对象的地址,查找到所述第一函数的调用对象,实现调用指令的执行。因此,所述设备在跳转到所述中间代码之前是在执行所述第一函数,此时所述设备内存中记录的是所述第一函数的表地址。在执行所述中间代码的指令时,所述设备将其内存记录的表地址保存到所述预留空间,则所述预留空间中保存的表地址实际上是所述第一函数的表地址。
[0078]需要说明的是,在执行所述第一函数的所述第一调用指令的过程中,所述设备在内存中记录的返回地址是所述第一调用指令的返回地址,这样所述设备能够在所述第一调用指令的调用完全之后再返回所述第一函数继续执行后续指令。其中,所述第一调用指令的返回地址表示所述第一函数中所述第一调用指令的下一条指令的地址。所述设备在跳转到所述中间代码之前是在执行所述第一调用指令,此时所述设备内存中记录的返回地址是所述第一调用指令的返回地址。在执行所述中间代码的指令时,所述设备将其内存记录的返回地址保存到所述预留空间,则所述预留空间中保存的返回地址实际上是所述第一调用指令的返回地址。
[0079]S204、响应于执行到所述中间代码中的第二调用指令,跳转到所述补丁文件的第三函数,所述第三函数用于对所述第二函数进行更新。
[0080]所述中间代码中在用于保存表地址的指令和用于保存返回地址的指令之后包括所述第二调用指令。所述第二调用指令用于调用所述补丁文件中的第三函数。可见,所述设备执行到所述第一函数的所述第一调用指令之后,所述设备实际上执行的是所述补丁文件中的所述第三函数而不是所述第二函数,因此就实现了所述第三函数对所述第二函数进行更新。
[0081]可以理解的是,在跳转到所述第三函数之后,所述设备执行的是所述第三函数,此时,所述设备内存中记录的表地址是所述第三函数的表地址。而所述设备内存中原本记录的所述第一函数的表地址将被丢弃。在跳转到所述第三函数之前,所述设备是在执行所述中间代码的所述第二调用指令,此时,所述设备内存中记录的返回地址是所述第二调用指令的返回地址,即所述中间代码中所述第二调用指令的下一条指令的地址。而所述设备内存中原本记录的所述第一调用指令的返回地址将被丢弃。
[0082]S205、响应于完成所述第三函数的执行,按照所述第二调用指令的返回地址,返回所述中间代码。
[0083]可以理解的是,在所述第三函数执行完成之后,所述设备按照内存中记录的所述第二调用指令的返回地址,返回所述中间代码中所述第二调用指令的下一条指令。
[0084]S206、按照所述中间代码的指令,从所述预留空间中恢复所述第一函数的表地址和所述第一调用指令的返回地址。
[0085]在本实施例中,所述中间代码中在所述第二调用指令之后还包括用于恢复表地址和用于恢复返回地址的指令。当从所述第三函数返回到所述中间代码之后,所述设备可以响应于用于恢复表地址的指令从所述预留空间中读取所述第一函数的表地址恢复到内存中记录,并且,所述设备可以响应于用于恢复返回地址的指令从所述预留空间中读取所述第一调用指令的返回地址恢复到内存中记录。其中,恢复到内存的所述第一调用指令的返回地址,可以用于使所述设备执行完成所述第三函数之后最终返回到所述第一函数中所述第一调用指令的下一条指令。恢复到内存的所述第一函数的表地址,可以用于使所述设备从所述第三函数返回到所述第一函数之后执行所述第一函数的过程中能够正常调用所述第一函数的调用对象。
[0086]S207、按照所述第一调用指令的返回地址,返回所述第一函数。
[0087]在返回所述第一函数之后,由于所述设备内存中记录的是所述第一函数的表地址,所述设备在后续执行所述第一函数的过程中能够根据所述第一函数的表结构查找调用对象的地址,从而正确执行所述第一函数后续的各调用指令。
[0088]进一步而言,在返回所述第一函数之后,若所述设备执行所述第一函数的过程中出现故障或异常,则所述设备可以确定所述补丁文件的加载导致了这种故障或异常,此时,所述设备可以取消所述补丁文件的加载。具体地,本实施例例如还可以包括:响应于所述返回所述第一函数,监测所述第一函数的执行是否出现故障;当监测到所述第一函数的执行出现故障时,删除所述第二函数中用于跳转到所述中间代码的第一条指令。可以理解的是,用于跳转到所述中间代码的指令是在所述补丁文件加载到软件时添加到所述第二函数作为第一条指令的。在所述第二函数中用于跳转到所述中间代码的第一条指令被删除之后,所述设备跳转到所述第二函数时将执行所述第二函数的所有指令而不再执行所述补丁文件中的所述中间代码和所述第三函数。
[0089]图3所示的是本实施例中设备执行代码指令的流程示意图。第一函数为软件的进程函数。第二函数为所述第一函数的调用对象,是所述软件中需要更新的原函数。补丁文件包括预留空间、中间代码和第三函数。第三函数是用于对所述第二函数更新的新函数。所述第一函数包括用于调用所述第二函数的第一调用指令和指令a,所述指令a是所述第一调用指令的下一条指令,所述第一调用指令的返回地址即是所述指令a的地址。所述第二函数包括用于调用所述中间代码的指令b,所述指令b是所述第二函数的第一条指令。所述预留空间包括用于保存表地址的空间a和用于保存返回地址的空间b。所述中间代码包括用于保存表地址的指令C、用于保存返回地址的指令d、用于调用所述第三函数的第二调用指令、用于恢复表地址的指令e、用于恢复返回地址的指令f和用于返回所述第一函数的指令h。所述指令c和所述指令d位于所述第二调用指令之前,所述指令e和所述指令f位于所述第二调用指令之后,所述指令h是所述中间代码的最后一条指令。所述指令e是所述第二调用指令的下一条指令,所述第二调用指令的返回地址为所述指令e的地址,或者,所述指令f是所述第二调用指令的下一条指令,所述第二调用指令的返回地址为所述指令f的地址。所述第三函数的最后一条指令为用于返回所述中间代码的指令。
[0090]按照图3所示的代码执行流程,在设备执行所述第一函数的过程中,当执行到所述第一调用指令时,所述设备跳转到所述第二函数。当执行到所述指令b时,所述设备跳转到所述中间代码。当执行到指令c时,所述设备将所述第一函数的表地址保存到所述预留空间中的空间a,并将作为返回地址的所述指令a的地址保存到所述预留空间中的空间b。当执行到所述第二调用指令时,所述设备跳转到所述第三函数。当执行到所述第三函数的最后一条指令时,所述设备返回所述中间代码。当执行到所述指令e时,所述设备从所述预留空间的空间a中恢复所述第一函数的表地址。当执行到所述指令f时,所述设备从所述预留空间的空间b中恢复所述指令a的地址作为返回地址。当执行所述指令h时,所述设备返回所述第一函数中的指令a。
[0091]在【具体实施方式】中,所述设备对于所述补丁文件的处理过程可以采用如图4所示的处理流程。在加载阶段,用于跳转到所述补丁文件的中间代码的指令被添加到所述第二函数中作为所述第二函数的第一条指令,所述第三函数的地址被添加到所述中间代码中形成用于调用所述第三函数的所述第二调用指令。在激活阶段,所述设备运行所述软件,按照指令执行所述第一函数、所述第二函数、所述中间代码和所述第三函数。若所述软件的运行过程中出现异常或故障,则取消所述补丁文件的加载,将所述第二函数中用于调用所述中间代码的第一条指令删除。在运行阶段,所述设备正常运行所述软件,不再针对所述软件运行过程中出现的异常或故障而取消所述补丁文件的加载。在删除阶段,将所述第二函数中用于调用所述中间代码的第一条指令删除,并在所述设备上删除所述补丁文件。
[0092]在本发明实施例的技术方案中,一方面,中间代码调用第三函数时丢失的第一函数的表地址,可以在执行完第三函数返回第一函数之前从预留空间恢复,因此,返回第一函数之后,在执行第一函数的过程中可以按照已恢复的表地址从第一函数的表结构中查找调用对象的地址,从而避免了从第三函数返回第一函数之后再执行第一函数时无法查找到第一函数的调用对象,避免了软件的运行出现故障,减少了软件运行出现中断的情况;另一方面,虽然中间代码调用第三函数时第一调用指令的返回地址被替换成了第二调用指令的返回地址,但在执行完第三函数返回第一函数之前可以从预留空间中恢复第一调用指令的返回地址,按照已恢复的第一调用指令的返回地址可以返回第一函数,从而避免了第三函数执行完之后无法返回第一函数继续后续指令的执行,避免了软件的运行出现故障,减少了软件运行出现中断的情况;再一方面,在补丁文件中留出预留空间来保存第一函数的表地址和第一调用指令的返回地址,所保存的表地址和返回地址不会占用栈帧结构,从而保证了第三函数的调用与第二函数的调用具有相同的栈帧结构,避免了栈帧结构改变所造成的信息获取错误,进而避免了信息获取错误导致的软件运行中断。由此可见,通过本实施例的技术方案,补丁文件对软件进行更新之后,导致软件中断运行的许多因素得以避免,因此,软件运行中断的可能性大大降低。
[0093]参见图5,示出了本发明实施例中一种生成补丁文件的方法的流程示意图。在本实施例中,所述方法例如具体可以包括:
[0094]S501、获取OBJ格式的补丁文件;
[0095]S502、根据所述OBJ格式的补丁文件生成PAT格式的补丁文件;
[0096]其中,所述PAT格式的补丁文件包括第三函数、中间代码和预留空间;
[0097]所述第三函数用于对第
当前第3页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1