CN115640037B - 程序更新方法和装置 - Google Patents
程序更新方法和装置 Download PDFInfo
- Publication number
- CN115640037B CN115640037B CN202211102965.2A CN202211102965A CN115640037B CN 115640037 B CN115640037 B CN 115640037B CN 202211102965 A CN202211102965 A CN 202211102965A CN 115640037 B CN115640037 B CN 115640037B
- Authority
- CN
- China
- Prior art keywords
- function
- target
- program
- target program
- address
- 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.)
- Active
Links
Classifications
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Stored Programmes (AREA)
Abstract
本申请提供了一种程序更新方法和装置,该方法包括:向处于运行状态的目标程序内加载目标动态链接库,目标程序的代码为基于C或者C++语言编写的,目标动态链接库包括:至少一个更新函数,更新函数为用于更新目标程序内需要更新的原始函数的函数;确定更新函数对应的原始函数在目标程序内的第一函数地址;确定更新函数在目标动态链接库的第二函数地址;确定目标程序中用于调用原始函数的至少一个调用函数,将调用函数中原始函数的第一函数地址替换为原始函数对应的更新函数的第二函数地址,以完成目标程序的更新。本申请的方案可以使得基于C或者C++语言开发的程序能够在运行状态完成更新,降低了该种程序更新的复杂度。
Description
技术领域
本申请涉及计算机技术领域,尤其涉及一种程序更新方法和装置。
背景技术
热更新是指在程序运行的过程中实现的即时更新。
通过热更新技术可以实现在不退出应用程序的前提下,完成应用程序的更新,从而提升应用程序的用户使用体验。如,以游戏为例,已开发出的游戏中可能会存在漏洞或者其他需要修复的代码,通过热更新技术可以在无需游戏玩家下线的前提下,完成游戏的更新,从而不会影响到游戏玩家的游戏体验。但是,目前采用C或者C++语言开发的程序日益增多,而由于C或者C++语言的特性,对于采用C或者C++语言开发的程序无法自动完成热更新的,必须需要退出程序之后才可以实现程序的更新,这必然导致了基于C或者C++代码的程序的更新复杂度较高。
发明内容
本申请提供了一种程序更新方法和装置,以使得基于C或者C++语言开发的程序能够在运行状态下完成更新,降低了该种程序更新的复杂度。
一方面,本申请提供了一种程序更新方法,包括:
向处于运行状态的目标程序内加载目标动态链接库,所述目标程序的代码为基于C或者C++语言编写的,所述目标动态链接库包括:至少一个更新函数,所述更新函数为用于更新所述目标程序内需要更新的原始函数的函数;
确定所述更新函数对应的原始函数在所述目标程序内的第一函数地址;
确定所述更新函数在所述目标动态链接库的第二函数地址;
确定所述目标程序中用于调用所述原始函数的至少一个调用函数,将所述调用函数中所述原始函数的第一函数地址替换为所述原始函数对应的更新函数的第二函数地址,以完成所述目标程序的更新。
在一种可能的实现方式中,在所述向处于运行状态的目标程序内加载目标动态链接库之前,还包括:
启动目标程序,通过目标程序的编译程序编译所述目标程序,所述编译程序中包括导出子函数;
在通过所述编译程序编译所述目标程序的过程中,通过所述导出子函数将所述目标程序中的函数的函数名称和函数地址导出到所述目标程序的第一导出表空间,所述第一导出表空间内的数据可供所述目标程序之外的其他程序访问;
所述确定所述更新函数对应的原始函数在所述目标程序内的第一函数地址,包括:
基于所述更新函数的函数名称,从所述第一导出表空间查询所述更新函数对应的原始函数在所述目标程序中的第一函数地址。
在又一种可能的实现方式中,所述目标动态链接库的第二导出表空间内存储有所述目标动态链接库内的函数的函数名称以及函数地址;
其中,所述第二导出表空间内存储的函数名称和函数地址为编译所述目标动态链接库时,导入到所述第二导出表空间内的;
所述第二导出表空间内的数据可供所述目标动态链接库之外的其他程序访问。
在又一种可能的实现方式中,所述向处于运行状态的目标程序内加载目标动态链接库,包括:
调用操作系统中的加载函数,通过所述加载函数向处于运行状态的所述目标程序内加载目标动态链接库。
在又一种可能的实现方式中,所述目标动态链接库中还包括:用于实现程序热更新的更新执行程序的代码;
所述方法还包括:
执行所述更新执行程序的代码,以通过所述更新执行程序执行确定所述第一函数地址、第二函数地址以及完成所述目标应用程序的更新的操作。
在又一种可能的实现方式中,所述向处于运行状态的目标程序内加载目标动态链接库,包括:
启动注入程序;
通过所述注入程序向处于运行状态的目标程序内注入目标动态链接库。
在又一种可能的实现方式中,通过所述注入程序执行确定所述第一函数地址、第二函数地址,以及将所述调用函数中所述原始函数的第一函数地址替换为所述原始函数对应的更新函数的第二函数地址的操作。
在又一种可能的实现方式中,所述将所述调用函数中所述原始函数的第一函数地址替换为所述原始函数对应的更新函数的第二函数地址,包括:
如果所述调用函数所需调用的原始函数处于被执行状态,等待所述原始函数执行完毕后,将所述调用函数中所述原始函数的第一函数地址替换为所述原始函数对应的更新函数的第二函数地址;
如果所述调用函数所需调用的原始函数未处于执行状态,将所述调用函数中所述原始函数的第一函数地址替换为所述原始函数对应的更新函数的第二函数地址。
在又一种可能的实现方式中,在所述将所述调用函数中所述原始函数的第一函数地址替换为所述原始函数对应的更新函数的第二函数地址之前,还包括:
如果检测到缓存中存储有所述目标程序的数据,清空所述缓存中存储的所述目标程序的数据。
又一方面,本申请还提供了一种程序更新装置,包括:
库加载单元,用于向处于运行状态的目标程序内加载目标动态链接库,所述目标程序的代码为基于C或者C++语言编写的,所述目标动态链接库包括:至少一个更新函数,所述更新函数为用于更新所述目标程序内需要更新的原始函数的函数;
第一地址确定单元,用于确定所述更新函数对应的原始函数在所述目标程序内的第一函数地址;
第二地址确定单元,用于确定所述更新函数在所述目标动态链接库的第二函数地址;
更新替换单元,用于确定所述目标程序中用于调用所述原始函数的至少一个调用函数,将所述调用函数中所述原始函数的第一函数地址替换为所述原始函数对应的更新函数的第二函数地址,以完成所述目标程序的更新。
由以上可知,在本申请实施例中,对于目标程序为采用C或者C++语言开发的程序,本申请可以预先生成该目标程序对应的目标动态链接库,该目标动态链接库中包括:用于更新该目标程序内待更新的各原始函数的至少一个更新函数。在此基础上,通过向处于运行状态的目标程序内加载该目标动态链接库,将目标程序中需要调用原始函数的调用函数中该原始函数的函数地址替换为该目标动态链接库中相应更新函数的函数地址,便可以实现利用目标动态链接库中的更新函数替换目标程序中待更新的原始函数,从而可以在目标程序处于运行状态下,完成该目标程序的更新,自然也就无需先中断目标程序的运行再重新利用新版本的目标程序来进行更新,降低了目标程序更新的复杂度。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1示出了本申请实施例提供的程序更新方法的一种流程示意图;
图2示出了本申请实施例提供的程序更新方法的又一种流程示意图;
图3示出了本申请实施例提供的程序更新方法的又一种流程示意图;
图4示出了本申请实施例提供的程序更新装置的一种组成结构示意图。
具体实施方式
本申请实施例的方案适用于对采用C或者C++语言开发的程序进行更新,无需用户退出正在运行的程序,便可以实现程序的更新,降低程序更新的复杂度。
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有付出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
如图1所示,其示出了本申请实施例提供的程序更新方法的一种流程示意图,本实施例可以应用于计算机设备。如,该计算机设备可以为提供C或者C++开发的程序所需运行环境的服务器。
本申请实施例的方法可以包括:
S101,向处于运行状态的目标程序内加载目标动态链接库。
其中,该目标程序的代码为基于C或者C++语言编写的。其中,目标程序的程序种类可以有多种可能,对此不加限制。例如,目标程序可以为采用C或者C++开发的游戏。
该目标动态链接库为用于对目标程序进行更新的动态链接库。该目标动态链接库包括:至少一个更新函数,该更新函数为用于更新该目标程序内需要更新的原始函数的函数。
可以理解的是,目标动态链接库为针对目标程序开发并编译出的动态库,因此,目标动态链接库中可以包含目标程序需要更新的函数对应的更新后函数。
为了便于区分,将目标程序中需要更新的函数称为原始函数,而将目标动态链接库中原始函数更新后的函数称为更新函数。可以理解的是,目标动态链接库中一个更新函数对应目标程序中一个原始函数,相互对应的原始函数与更新函数的函数名称相同。
可以理解的是,目标动态链接库可以预先存储在计算机设备中,在此基础上,计算机设备可以获得动态库加载指令,该动态库加载指令指示有所需加载的目标动态链接库的名称。相应的,可以基于目标动态链接库的名称,向处于运行状态的目标程序内加载目标动态链接库。
其中,向目标程序中加载目标动态链接库的方式也可以有多种,对此不加限制,下面结合几种实现动态链接库加载的方式进行介绍。
如,一种可能的实现方式中,可以通过调用操作系统内的加载函数来加载该目标动态链接库。例如,以计算机设备中的操作系统为Linux系统为例,可以调用该操作系统内的dlopen函数来加载该目标动态链接库。
特别的,本申请可以在目标程序中预先配置加载代码,通过执行该加载代码可以实现调用操作系统的加载函数,以使得目标程序可以通过调用操作系统内的加载函数加载该目标动态链接库。
在又一种可能的实现方式中,可以启动注入程序,该注入程序也就是实现函数或者程序注入的注入器。相应的,可以通过注入程序向处于运行状态的目标程序内注入目标动态链接库。
S102,针对每一个更新函数,确定该更新函数对应的原始函数在目标程序内的第一函数地址。
如,可以确定更新函数对应的原始函数的函数名称,基于原始函数的函数名称,确定该原始函数在目标程序内的函数地址。
其中,为了便于区分,将目标程序中的原始函数在该目标程序内的函数地址称为第一函数地址。原始函数的第一函数地址也就是原始函数在目标程序的进程空间内的函数地址。
S103,针对每个更新函数,确定该更新函数在该目标动态链接库的第二函数地址。
为了便于区分,将更新函数在动态链接库中的函数地址称为第二函数地址。该第二函数地址为更新函数在动态链接库的进程空间内的地址。
S104,确定该目标程序中用于调用原始函数的至少一个调用函数,将该调用函数中原始函数的第一函数地址替换为该原始函数对应的更新函数的第二函数地址,以完成目标程序的更新。
在本申请中,调用函数是指目标程序中,涉及到调用目标程序内需要更新的原始函数的调用函数。如,假设目标程序中需要更新的函数包括函数a,而某个函数需要调用函数a,那么这个函数就属于调用该函数a的调用函数。
可以理解的是,目标程序中调用函数原本调用的地址是目标程序中原始函数的第一函数地址,而为了使得将目标程序中原始函数替换为相应的更新函数,就需要将该调用函数中该第一函数地址替换为目标动态链接库中与该原始函数对应的更新函数的函数地址,即第二函数地址。相应的,目标程序执行该调用函数时,调用函数调用就是动态链接库中已经更新后的更新函数,从而实现了目标程序的热更新。
可以理解的是,如果调用函数所需调用的原始函数处于被执行状态,即目标程序当前正在执行该原始函数,在此情况下,为了保证目标程序的可靠执行,避免执行错误等,本申请需要等待该原始函数执行完毕后,再将调用函数中该原始函数的第一函数地址替换为原始函数对应的更新函数的第二函数地址。反之,如果调用函数所需调用的原始函数未处于执行状态,则可以直接将调用函数中原始函数的第一函数地址替换相应的更新函数的第二函数地址。
在实际应用中,中央处理器CPU在执行目标程序的过程中,为了提高效率,可能会将目标程序中一些数据缓存到缓存中,如,缓存到一级缓存或者二级缓存中。在该种情况中,即使将调用函数中原始函数的函数地址替换为相应更新函数的第二函数地址,由于CPU仍然执行的是缓存中的相应数据,也不会实现程序的更新。
基于此,本申请在替换调用函数中的函数地址之前,如果检测到缓存中存储有所述目标程序的数据,还可以先清空缓存中存储的该目标程序的数据,然后再执行将调用函数中原始函数的第一函数地址替换为原始函数对应的更新函数的第二函数地址的操作。
本申请的发明人经过研究发现:目前采用C/C++开发的程序日益增多,而C/C++代码容易产生错误,而且由于C/C++语言的特性,基于C/C++开发的程序自身是无法直接实现热更新的,在该种情况下,不仅会导致程序更新复杂,还会影响到用户正常使用程序。
例如,以C/C++开发的游戏为例,如果游戏不支持热更新,那么一旦游戏存在漏洞需要修改,就必须通过服务器重启来实现游戏更新,然而,服务器来更新游戏,必然会导致游戏玩家下线,这样,不仅会导致游戏更新复杂度高,也会影响到游戏玩家正常的游戏操作。
基于以上发现,本申请可以借助动态链接库,将动态链接库内的函数作为新的内容添加到原有的程序中,并替换原有程序中需要更新的函数,以在程序运行状态下实现程序内函数的更新。
结合以上内容可知,在本申请实施例中,对于目标程序为采用C或者C++语言开发的程序,本申请可以预先生成该目标程序对应的目标动态链接库,该目标动态链接库中包括:用于更新该目标程序内待更新的各原始函数的至少一个更新函数。在此基础上,通过向处于运行状态的目标程序内加载该目标动态链接库,将目标程序中需要调用原始函数的调用函数中该原始函数的函数地址替换为该目标动态链接库中相应更新函数的函数地址,便可以实现利用动态链接库中的更新函数替换目标程序中待更新的原始函数,从而可以在目标程序处于运行状态下完成该目标程序的更新,自然也就无需先中断目标程序的运行再重新利用新版本的目标程序来进行更新,降低了目标程序更新的复杂度。
同时,由于本申请可以在程序运行状态下实现程序的更新,也就是实现了对于采用C或者C++语言开发的程序的热更新,因此,在更新程序的过程中无需用户退出程序,避免了程序更新而影响到用户使用程序。
例如,以目标程序为基于C或C++开发的游戏为例,通过本申请的方案可以实现对服务器的游戏进行热更新,可以在不重启游戏的情况下完成热更新,自然也就无需游戏玩家下线,从而可以在不影响游戏玩家操作游戏的前提下实现游戏程序的更新。
在本申请中,目标动态链接库是在更新目标程序之前生成的,而在目标动态链接库加载到目标程序之后,目标程序可以访问动态链接库内的函数。但是,动态链接库或者执行该目标程序更新的其他程序可能无法访问目标程序内的部分函数。在此基础上,如果动态链接库内的更新函数可能会需要访问目标程序内的其他函数,那么动态链接库无法获得目标程序中相应函数的地址,则可能会导致无法完成目标程序的更新。
基于此,在本申请中,还需要将目标程序中的函数的函数名称以及函数地址导出到目标函数的导出表空间中。
具体的,在加载目标动态链接库之前,会涉及到启动目标程序,当然,启动该目标程序并非是为了更新程序,可能是为了运行目标程序,以为用户提供服务。但是每次启动目标程序,都会通过目标程序的编译程序编译该目标程序。
在本申请中,该编译程序中包括导出子函数,在此基础上,在通过编译程序编译该目标程序的过程中,通过该导出子函数将目标程序中的函数的函数名称和函数地址导出到目标程序的导出表空间。该导出表空间为目标程序内可供外部访问的空间,相应的,导出表空间内的数据可供该目标程序之外的其他程序访问。
为了便于区分,将该目标程序对应的导出表空间称为第一导出表空间。
可以理解的是,将目标程序的函数的函数名称和函数地址导出到该第一导出表空间的同时,本申请还会将目标程序中的变量的变量名称以及变量地址也导出到该第一导出表空间中,以便其他程序访问。
可以理解的是,在生成目标动态链接库的过程中,为了使得生成的目标动态链接库能够被后续加载该目标动态链接库的程序访问,实际上在编译目标动态链接库的编译程序中,添加用于实现函数和变量导出的导出子函数。相应的,在编译目标动态链接库的过程中,会将目标动态链接库中的函数的函数名称和函数地址导出到目标动态链接库的导出表空间内。
为了便于区分,将目标动态链接库对应的导出表空间称为第二导出表空间。该第二导出表空间内的数据可供所述目标动态链接库之外的其他程序访问。
在以上基础上,在向目标程序中加载该目标动态链接库之后,目标程序与目标动态链接库之间就可以相互访问相应的函数的地址等信息。
可以理解的是,在目标程序的第一导出表空间存储有目标程序中函数的函数名称和函数地址的前提下,对于任意一个更新函数,由于更新函数的函数名称与原始函数的函数名称一致。基于此,本申请可以基于该更新函数的函数名称,从该第一导出表空间查询该更新函数对应的原始函数在该目标程序中的第一函数地址。
在本申请中,向目标程序中加载该目标动态链接库的方式不同,执行原始函数与更新函数的函数地址替换的具体实现也可以有所不同。为了便于理解本申请的方案,下面结合向目标程序中加载目标动态链接库的不同方式对本申请的方案进行说明。
如图2所示,其示出了本申请实施例提供的程序更新方法的又一种流程示意图,本实施例的方法可以包括:
S201,通过目标程序获得动态库加载指令。
目标程序的代码为基于C或者C++语言编写的。
其中,该动态库加载指令指示有所需加载的目标动态链接库的名称。
在本申请中,目标程序中可以添加一段用于实现动态库加载的代码,运行该段代码可以响应用户输入的动态库加载指令并完成动态链接库加载。
在本申请中,目标程序的第一导出表空间内存储有所述目标程序中导出的函数的函数名称和函数地址,以及变量的变量名称和变量地址,具体导出方式可以参见前面介绍,对此不再赘述。其中,第一导出表空间内的数据可供该目标程序之外的其他程序访问。
S202,基于该目标动态链接库的名称,通过目标程序调用操作系统中的加载函数,通过加载函数向处于运行状态的目标程序内加载目标动态链接库。
其中,加载函数为操作系统中用于实现动态库加载的函数。如,目标程序调用加载函数并向加载函数传输该目标动态链接库的名称,使得加载函数向目标程序中加载该目标动态链接库。
如,以操作系统为Linux为例,目标程序可以调用操作系统中的dlopen函数来加载该目标动态链接库。
其中,该目标动态链接库包括:至少一个更新函数,该更新函数为用于更新目标程序内需要更新的原始函数的函数。
在本实施例中,该目标动态链接库中还包括:用于实现程序热更新的更新执行程序的代码。该部分代码用于实现目标程序的热更新,相应的,通过执行该代码可以执行后续确定所述第一函数地址、第二函数地址以及完成所述目标应用程序的更新的操作。
可以理解的是,在不同操作系统下,动态链接库的类型也会有所不同,如,对于widows操作系统而言,动态链接库是扩展名为.dll的文件;对于linux操作系统而言,动态链接库是扩展名为.so的文件。
以linux操作系统为例,在Linux下可执行文件的两种表现形式(ELF SO)
ELF(Executable and LinkableFormat,可执行和链接格式)是一种可执行文件的格式。它是Unix/Linux系统下的二进制文件的标准格式。与之对应的是,Windows系统的PE(Portable Executable)可执行文件格式。
SO文件是Unix/Linux系统中的动态库文件,被称为共享目标文件(Shared ObjectFile),后缀名为.so,它是ELF的一种。
ELF文件的主要内容是头结构和段内容,ELF头结构描述了整个ELF文件的属性,包括文件类型(如,可执行文件、可重定位或者共享目标文件等)、虚拟入口地址、段表偏移、文件本身的大小等。
其中,ELF文件中包括:动态链接的跳转表(plt表)和全局入口表(got表),目标程序的调用需要通过这两个表,调用是从plt到got再跳转到真正的函数的函数地址进行调用。plt表是模块被加载到进程空间时填充的。也就是说,不同模块中的函数都用,都需要通过plt表来进行中转。生成plt表是库被加载到进程空间中自动执行的,因此,我们只需要使得动态链接库与目标程序能够相互访问即可。
在本申请中,由于动态链接库的属性,如动态链接库的函数名称和地址等已导入到动态链接库的导出表空间,因此,动态链接库加载到目标程序后,目标程序可以访问动态链接库。同时,由于本申请中目标程序的函数的函数名称和函数地址等也导出到目标程序的导出表空间,使得加载到目标程序内的动态链接库也可以访问目标程序中函数的信息。
S203,执行更新执行程序的代码,以启动更新执行程序。
S204,针对每个更新函数,基于该更新函数的函数名称,通过更新执行程序从第一导出表空间查询该更新函数对应的原始函数在目标程序中的第一函数地址。
如,前面所述,目标动态链接库可以访问第一导出表空间,因此,目标动态链接库中的更新执行程序可以从第一导出表空间获得各个更新函数对应的原始函数在目标程序中的函数地址,即第一函数地址。
其中,更新执行程序可以通过解析第一导出表空间中各个符号,确定与更新函数相同名称的原始函数的函数地址。如,以linux系统为例,更新执行程序可以调用操作系统中的dlsym函数解析出第一导出表空间内的各个符号。
S205,针对每个更新函数,通过该更新执行程序确定更新函数在动态链接库的第二函数地址。
由于更新函数属于目标动态链接库内的函数,因此,更新执行程序可以直接访问动态链接库获得各个更新函数的第二函数地址。
S206,通过更新执行程序确定该目标程序中用于调用原始函数的至少一个调用函数,将调用函数中该原始函数的第一函数地址替换为该原始函数对应的更新函数的第二函数地址,以完成目标程序的更新。
在本实施例中,确定目标程序中涉及到调用待更新的原始函数的调用函数的方式可以有多种可能。如,在一种可能的实现方式中,可以在动态链接库中预先配置需要地址替换的各个调用函数,在此基础上,通过更新执行程序可以确定配置的至少一个调用函数,该调用函数属于目标程序中用于调用更新函数对应的原始函数的调用函数。
下面对采用注入方式实现向目标程序内加载目标动态链接库的情况进行说明。
对于注入方式加载目标动态链接库的实现方式,本申请可以通过在计算机设备中启动注入程序,通过注入程序向处于运行状态的目标程序内注入目标动态链接库。
其中,注入程序向目标程序内注入目标动态链接库时,注入程序通过调用操作系统的相关函数实现访问目标动态链接库和目标程序。在此基础上,注入程序可以将目标动态链接库注入到目标程序的进程空间中空闲的空间区域。
在通过注入程序向目标程序注入目标动态链接库的情况下,目标程序无法感知目标动态链接库,因此,也就无法通过目标程序来启动目标动态链接库中执行热更新的相关代码。基于此,本申请可以通过注入程序来实现热更新。
如图3所示,其示出了本申请实施例提供的程序更新方法的又一种流程示意图,本实施例可以包括:
S301,启动注入程序,通过注入程序获得动态库加载指令。
其中,该动态库加载指令指示有需要向目标程序中加载的目标动态链接库的名称。
在本申请中,目标程序的第一导出表空间内存储有所述目标程序中导出的函数的函数名称和函数地址,以及变量的变量名称和变量地址,具体导出方式可以参见前面介绍,对此不再赘述。其中,第一导出表空间内的数据可供该目标程序之外的其他程序访问。
S302,基于该目标动态链接库的名称,通过注入程序向处于运行状态的目标程序内注入目标动态链接库。
如,注入程序可以通过调用系统函数访问目标程序的进程空间,以确定目标程序中空闲区间,将目标动态链接库注入到该目标程序的进程空间中的空闲区间内。
S303,通过注入程序访问目标动态链接库的第二导出表空间,针对第二导出表空间内每个更新函数,基于该更新函数的函数名称,从第一导出表空间查询该更新函数对应的原始函数在目标程序中的第一函数地址。
如,前面所述,注入程序具备访问目标动态链接库的第二导出表空间以及访问目标程序的第一导出表空间的权限,因此,注入程序可以确定目标动态链接库中包含的各个更新函数的函数名称及其地址,还可以通过第一导出表空间确定各更新函数对应的原始函数的第一函数地址。
S304,针对每个更新函数,通过该注入程序确定更新函数在动态链接库的第二函数地址。
S305,通过注入程序确定该目标程序中用于调用原始函数的至少一个调用函数,将调用函数中该原始函数的第一函数地址替换为该原始函数对应的更新函数的第二函数地址,以完成目标程序的更新。
如,注入程序中可以预先配置有该目标程序中需要替换的各个调用函数的信息,基于此,注入程序可以确定预先配置的该目标程序中用于调用待更新的原始函数的各调用函数。在此基础上,针对每个调用函数,注入程序可以将调用函数所调用的原始函数的第一函数地址分别替换为相应的第二函数地址。
对应本申请的一种程序更新方法,本申请还提供了一种程序更新装置。
如图4所示,其示出了本申请实施例提供的一种程序更新装置的一种组成结构示意图,本实施例的装置可以包括:
库加载单元401,用于向处于运行状态的目标程序内加载目标动态链接库,所述目标程序的代码为基于C或者C++语言编写的,所述目标动态链接库包括:至少一个更新函数,所述更新函数为用于更新所述目标程序内需要更新的原始函数的函数;
第一地址确定单元402,用于确定所述更新函数对应的原始函数在所述目标程序内的第一函数地址;
第二地址确定单元403,用于确定所述更新函数在所述目标动态链接库的第二函数地址;
更新替换单元404,用于确定所述目标程序中用于调用所述原始函数的至少一个调用函数,将所述调用函数中所述原始函数的第一函数地址替换为所述原始函数对应的更新函数的第二函数地址,以完成所述目标程序的更新。
在一种可能的实现方式中,该装置还包括:
程序启动编译单元,用于在库加载单元向处于运行状态的目标程序内加载目标动态链接库之前,启动目标程序,通过目标程序的编译程序编译所述目标程序,所述编译程序中包括导出子函数;
函数导出单元,用于在程序启动编译单元通过所述编译程序编译所述目标程序的过程中,通过所述导出子函数将所述目标程序中的函数的函数名称和函数地址导出到所述目标程序的第一导出表空间,所述第一导出表空间内的数据可供所述目标程序之外的其他程序访问;
所述第一地址确定单元,具体为,用于基于所述更新函数的函数名称,从所述第一导出表空间查询所述更新函数对应的原始函数在所述目标程序中的第一函数地址。
在又一种可能的实现方式中,所述目标动态链接库的第二导出表空间内存储有所述目标动态链接库内的函数的函数名称以及函数地址;
其中,所述第二导出表空间内存储的函数名称和函数地址为编译所述目标动态链接库时导入到所述第二导出表空间内的;
所述第二导出表空间内的数据可供所述目标动态链接库之外的其他程序访问。
在又一种可能的实现方式中,库加载单元,包括:
调用加载单元,用于调用操作系统中的加载函数,通过所述加载函数向处于运行状态的所述目标程序内加载目标动态链接库。
在又一种可能的实现方式中,所述目标动态链接库中还包括:用于实现程序热更新的更新执行程序的代码;
该装置还包括:
代码执行单元,用于执行所述更新执行程序的代码,以通过所述更新执行程序执行确定所述第一地址确定单元、第二地址确定单元以及更新替换单元的操作。
在又一种可能的实现方式中,该库加载单元,包括:
注入启动单元,用于启动注入程序;
库注入单元,用于通过所述注入程序向处于运行状态的目标程序内注入目标动态链接库。
在又一种可能的实现方式中,所述第一地址确定单元、第二地址确定单元以及更新替换单元为通过所述注入程序执行。
在又一种可能的实现方式中,更新替换单元,包括:
第一替换子单元,用于如果所述调用函数所需调用的原始函数处于被执行状态,等待所述原始函数执行完毕后,将所述调用函数中所述原始函数的第一函数地址替换为所述原始函数对应的更新函数的第二函数地址;
第二替换子单元,用于如果所述调用函数所需调用的原始函数未处于执行状态,将所述调用函数中所述原始函数的第一函数地址替换为所述原始函数对应的更新函数的第二函数地址。
在又一种可能的实现方式中,该装置还包括:
缓存清空单元,用于在更新替换单元将所述调用函数中所述原始函数的第一函数地址替换为所述原始函数对应的更新函数的第二函数地址之前,如果检测到缓存中存储有所述目标程序的数据,清空所述缓存中存储的所述目标程序的数据。
需要说明的是,本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。同时,本说明书中各实施例中记载的特征可以相互替换或者组合,使本领域专业技术人员能够实现或使用本申请。对于装置类实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括要素的过程、方法、物品或者设备中还存在另外的相同要素。
对所公开的实施例的上述说明,使本领域技术人员能够实现或使用本申请。对这些实施例的多种修改对本领域技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本申请的精神或范围的情况下,在其它实施例中实现。因此,本申请将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
以上仅是本申请的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本申请原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本申请的保护范围。
Claims (9)
1.一种程序更新方法,其特征在于,包括:
向处于运行状态的目标程序内加载目标动态链接库,所述目标程序的代码为基于C或者C++语言编写的,所述目标动态链接库包括:至少一个更新函数,所述更新函数为用于更新所述目标程序内需要更新的原始函数的函数;
确定所述更新函数对应的原始函数在所述目标程序内的第一函数地址;
确定所述更新函数在所述目标动态链接库的第二函数地址;
确定所述目标程序中用于调用所述原始函数的至少一个调用函数,将所述调用函数中所述原始函数的第一函数地址替换为所述原始函数对应的更新函数的第二函数地址,以完成所述目标程序的更新;
其中,在所述向处于运行状态的目标程序内加载目标动态链接库之前,还包括:
启动目标程序,通过目标程序的编译程序编译所述目标程序,所述编译程序中包括导出子函数;
在通过所述编译程序编译所述目标程序的过程中,通过所述导出子函数将所述目标程序中的函数的函数名称和函数地址导出到所述目标程序的第一导出表空间,所述第一导出表空间内的数据可供所述目标程序之外的其他程序访问,使得动态链接库内的更新函数能够访问所述目标程序内的其他函数;
所述确定所述更新函数对应的原始函数在所述目标程序内的第一函数地址,包括:
基于所述更新函数的函数名称,从所述第一导出表空间查询所述更新函数对应的原始函数在所述目标程序中的第一函数地址。
2.根据权利要求1所述的方法,其特征在于,所述目标动态链接库的第二导出表空间内存储有所述目标动态链接库内的函数的函数名称以及函数地址;
其中,所述第二导出表空间内存储的函数名称和函数地址为编译所述目标动态链接库时,导入到所述第二导出表空间内的;
所述第二导出表空间内的数据可供所述目标动态链接库之外的其他程序访问。
3.根据权利要求1所述的方法,其特征在于,所述向处于运行状态的目标程序内加载目标动态链接库,包括:
调用操作系统中的加载函数,通过所述加载函数向处于运行状态的所述目标程序内加载目标动态链接库。
4.根据权利要求3所述的方法,其特征在于,所述目标动态链接库中还包括:用于实现程序热更新的更新执行程序的代码;
所述方法还包括:
执行所述更新执行程序的代码,以通过所述更新执行程序执行确定所述第一函数地址、第二函数地址以及完成所述目标应用程序的更新的操作。
5.根据权利要求1所述的方法,其特征在于,所述向处于运行状态的目标程序内加载目标动态链接库,包括:
启动注入程序;
通过所述注入程序向处于运行状态的目标程序内注入目标动态链接库。
6.根据权利要求5所述的方法,其特征在于,通过所述注入程序执行确定所述第一函数地址、第二函数地址,以及将所述调用函数中所述原始函数的第一函数地址替换为所述原始函数对应的更新函数的第二函数地址的操作。
7.根据权利要求1所述的方法,其特征在于,所述将所述调用函数中所述原始函数的第一函数地址替换为所述原始函数对应的更新函数的第二函数地址,包括:
如果所述调用函数所需调用的原始函数处于被执行状态,等待所述原始函数执行完毕后,将所述调用函数中所述原始函数的第一函数地址替换为所述原始函数对应的更新函数的第二函数地址;
如果所述调用函数所需调用的原始函数未处于执行状态,将所述调用函数中所述原始函数的第一函数地址替换为所述原始函数对应的更新函数的第二函数地址。
8.根据权利要求1所述的方法,其特征在于,在所述将所述调用函数中所述原始函数的第一函数地址替换为所述原始函数对应的更新函数的第二函数地址之前,还包括:
如果检测到缓存中存储有所述目标程序的数据,清空所述缓存中存储的所述目标程序的数据。
9.一种程序更新装置,其特征在于,包括:
库加载单元,用于向处于运行状态的目标程序内加载目标动态链接库,所述目标程序的代码为基于C或者C++语言编写的,所述目标动态链接库包括:至少一个更新函数,所述更新函数为用于更新所述目标程序内需要更新的原始函数的函数;
第一地址确定单元,用于确定所述更新函数对应的原始函数在所述目标程序内的第一函数地址;
第二地址确定单元,用于确定所述更新函数在所述目标动态链接库的第二函数地址;
更新替换单元,用于确定所述目标程序中用于调用所述原始函数的至少一个调用函数,将所述调用函数中所述原始函数的第一函数地址替换为所述原始函数对应的更新函数的第二函数地址,以完成所述目标程序的更新;
其中,在所述向处于运行状态的目标程序内加载目标动态链接库之前,还包括:
启动目标程序,通过目标程序的编译程序编译所述目标程序,所述编译程序中包括导出子函数;
在通过所述编译程序编译所述目标程序的过程中,通过所述导出子函数将所述目标程序中的函数的函数名称和函数地址导出到所述目标程序的第一导出表空间,所述第一导出表空间内的数据可供所述目标程序之外的其他程序访问,使得动态链接库内的更新函数能够访问所述目标程序内的其他函数;
所述确定所述更新函数对应的原始函数在所述目标程序内的第一函数地址,包括:
基于所述更新函数的函数名称,从所述第一导出表空间查询所述更新函数对应的原始函数在所述目标程序中的第一函数地址。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211102965.2A CN115640037B (zh) | 2022-09-09 | 2022-09-09 | 程序更新方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211102965.2A CN115640037B (zh) | 2022-09-09 | 2022-09-09 | 程序更新方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN115640037A CN115640037A (zh) | 2023-01-24 |
CN115640037B true CN115640037B (zh) | 2023-08-11 |
Family
ID=84942955
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211102965.2A Active CN115640037B (zh) | 2022-09-09 | 2022-09-09 | 程序更新方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115640037B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116400945B (zh) * | 2023-06-08 | 2023-10-27 | 中航信移动科技有限公司 | 一种动态链接库升级方法、电子设备及存储介质 |
CN116414424B (zh) * | 2023-06-09 | 2023-09-12 | 建信金融科技有限责任公司 | 热更新方法、装置、设备及存储介质 |
Citations (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6698015B1 (en) * | 2000-06-13 | 2004-02-24 | Cisco Technology, Inc. | Apparatus and method for improving performance of critical code execution |
CN103744709A (zh) * | 2014-01-23 | 2014-04-23 | 华为技术有限公司 | 补丁加载方法及装置 |
CN103942073A (zh) * | 2014-04-08 | 2014-07-23 | 北京奇虎科技有限公司 | 实现系统热补丁的方法及装置 |
CN105159738A (zh) * | 2015-08-20 | 2015-12-16 | 上海斐讯数据通信技术有限公司 | 一种热补丁实现方法及系统 |
CN105630557A (zh) * | 2015-12-24 | 2016-06-01 | 迈普通信技术股份有限公司 | 热补丁方法和装置 |
CN106371940A (zh) * | 2015-07-21 | 2017-02-01 | 腾讯科技(深圳)有限公司 | 一种程序崩溃解决方法及装置 |
CN107357622A (zh) * | 2017-07-17 | 2017-11-17 | 迈普通信技术股份有限公司 | 热补丁实现方法及通信设备 |
CN110471690A (zh) * | 2019-06-25 | 2019-11-19 | 珠海格力电器股份有限公司 | 动态链接库so文件的加载方法、装置及存储介质 |
CN110795128A (zh) * | 2019-10-30 | 2020-02-14 | 上海米哈游天命科技有限公司 | 一种程序漏洞修复方法、装置、存储介质及服务器 |
CN111782302A (zh) * | 2020-07-13 | 2020-10-16 | 腾讯科技(深圳)有限公司 | 进程更新方法和装置、存储介质及电子设备 |
CN114816482A (zh) * | 2022-04-28 | 2022-07-29 | 苏州浪潮智能科技有限公司 | 块存储服务的升级方法、装置、计算机设备及存储介质 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110275722B (zh) * | 2019-06-21 | 2023-08-08 | 北京百度网讯科技有限公司 | 用于升级应用的方法、装置、设备和存储介质 |
-
2022
- 2022-09-09 CN CN202211102965.2A patent/CN115640037B/zh active Active
Patent Citations (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6698015B1 (en) * | 2000-06-13 | 2004-02-24 | Cisco Technology, Inc. | Apparatus and method for improving performance of critical code execution |
CN103744709A (zh) * | 2014-01-23 | 2014-04-23 | 华为技术有限公司 | 补丁加载方法及装置 |
CN103942073A (zh) * | 2014-04-08 | 2014-07-23 | 北京奇虎科技有限公司 | 实现系统热补丁的方法及装置 |
CN106371940A (zh) * | 2015-07-21 | 2017-02-01 | 腾讯科技(深圳)有限公司 | 一种程序崩溃解决方法及装置 |
CN105159738A (zh) * | 2015-08-20 | 2015-12-16 | 上海斐讯数据通信技术有限公司 | 一种热补丁实现方法及系统 |
CN105630557A (zh) * | 2015-12-24 | 2016-06-01 | 迈普通信技术股份有限公司 | 热补丁方法和装置 |
CN107357622A (zh) * | 2017-07-17 | 2017-11-17 | 迈普通信技术股份有限公司 | 热补丁实现方法及通信设备 |
CN110471690A (zh) * | 2019-06-25 | 2019-11-19 | 珠海格力电器股份有限公司 | 动态链接库so文件的加载方法、装置及存储介质 |
CN110795128A (zh) * | 2019-10-30 | 2020-02-14 | 上海米哈游天命科技有限公司 | 一种程序漏洞修复方法、装置、存储介质及服务器 |
CN111782302A (zh) * | 2020-07-13 | 2020-10-16 | 腾讯科技(深圳)有限公司 | 进程更新方法和装置、存储介质及电子设备 |
CN114816482A (zh) * | 2022-04-28 | 2022-07-29 | 苏州浪潮智能科技有限公司 | 块存储服务的升级方法、装置、计算机设备及存储介质 |
Non-Patent Citations (1)
Title |
---|
软件化雷达在线可重构技术研究与实现;余壮;中国优秀硕士学位论文全文数据库 信息科技辑(第1期);I136-2245 * |
Also Published As
Publication number | Publication date |
---|---|
CN115640037A (zh) | 2023-01-24 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN115640037B (zh) | 程序更新方法和装置 | |
US8924922B2 (en) | Pre-compiling hosted managed code | |
US8677329B2 (en) | Methods and apparatuses for a compiler server | |
US9946873B2 (en) | Methods and apparatuses for secure compilation | |
CN110275722B (zh) | 用于升级应用的方法、装置、设备和存储介质 | |
CN107451474B (zh) | 用于终端的软件漏洞修复方法和装置 | |
CN106406961A (zh) | 一种基于浏览器加载、提供应用程序的方法、装置 | |
US20100153929A1 (en) | Converting javascript into a device-independent representation | |
US8607203B1 (en) | Test automation framework using dependency injection | |
CN113885967B (zh) | 一种小程序的启动方法、装置、设备及介质 | |
US10019598B2 (en) | Dynamic service discovery | |
CN108845841B (zh) | 改变终端应用行为的方法、装置及终端 | |
RU2635891C2 (ru) | Механизм инсталляции и формат пакета для распараллеливаемых надежных инсталляций | |
CN112612502A (zh) | 补丁生成方法、装置、设备及存储介质 | |
US7987457B2 (en) | Targeted patching for native generation images | |
CN111880804A (zh) | 应用程序代码的处理方法及装置 | |
US9841982B2 (en) | Locating import class files at alternate locations than specified in classpath information | |
US20180349156A1 (en) | Techniques for performing dynamic linking | |
CN105677424A (zh) | 一种基于微内核的组件化开发集成的热加载方法 | |
US20090049423A1 (en) | Javascripttm programming extension | |
CN113590179B (zh) | 插件检测方法、装置、电子设备及存储介质 | |
CN115374083A (zh) | 数据源的切换方法、装置、电子设备及存储介质 | |
CN109960522B (zh) | 一种软件升级方法及装置 | |
CN111949301A (zh) | 应用程序热更新方法、装置、计算机可读存储介质和计算机设备 | |
Wen et al. | Wasmslim: Optimizing webassembly binary distribution via automatic module splitting |
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 | ||
CB03 | Change of inventor or designer information | ||
CB03 | Change of inventor or designer information |
Inventor after: Dai Xin Inventor after: Sun Yu Inventor after: Hou Jian Inventor after: Song Wen Inventor before: Dai Xin Inventor before: Sun Yu Inventor before: Hou Jian |
|
GR01 | Patent grant | ||
GR01 | Patent grant |