CN113504934A - 补丁程序编译方法、程序修补方法及相关设备 - Google Patents

补丁程序编译方法、程序修补方法及相关设备 Download PDF

Info

Publication number
CN113504934A
CN113504934A CN202110794690.2A CN202110794690A CN113504934A CN 113504934 A CN113504934 A CN 113504934A CN 202110794690 A CN202110794690 A CN 202110794690A CN 113504934 A CN113504934 A CN 113504934A
Authority
CN
China
Prior art keywords
program
target
patch
function
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.)
Pending
Application number
CN202110794690.2A
Other languages
English (en)
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.)
Shanghai Lingxin Technology Co ltd
Anhui Lingsi Intelligent Technology Co ltd
Original Assignee
Shanghai Lingxin Technology Co ltd
Anhui Lingsi Intelligent Technology 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 Shanghai Lingxin Technology Co ltd, Anhui Lingsi Intelligent Technology Co ltd filed Critical Shanghai Lingxin Technology Co ltd
Priority to CN202110794690.2A priority Critical patent/CN113504934A/zh
Publication of CN113504934A publication Critical patent/CN113504934A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/60Software deployment
    • G06F8/65Updates
    • G06F8/658Incremental updates; Differential updates
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/48Incremental compilation

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Security & Cryptography (AREA)
  • Stored Programmes (AREA)

Abstract

本申请提出一种补丁程序编译方法、程序修补方法及相关设备,该补丁程序编译方法包括:获取目标符号信息,所述目标符号信息中包含目标程序中的函数的名称信息和地址信息,和/或包含目标程序中的变量的名称信息和地址信息;对补丁程序进行编译处理,所述补丁程序中包含调用所述目标程序中的函数的程序代码,和/或包含引用所述目标程序中的变量的程序代码;根据所述目标符号信息,对编译后的所述补丁程序进行链接处理,使所述补丁程序链接至所述目标程序中的函数和/或变量。通过执行上述技术方案,可以使补丁程序调用原程序中的函数或引用原程序的变量,从而提升补丁编译效率以及提升软件程序修补效率。

Description

补丁程序编译方法、程序修补方法及相关设备
技术领域
本申请涉及软件技术领域,尤其涉及一种补丁程序编译方法及装置、一种程序修补方法及装置、电子设备、存储介质。
背景技术
软件打补丁是常见的软件程序修补和升级方法。为便于软件程序的修补和升级,在软件程序内部预留补丁点,当需要对软件程序进行修补或升级时,通过补丁点调用补丁程序即可。
通常情况下,补丁程序是与待修补的软件程序相关的程序,补丁程序中的某些功能需要依托原软件程序中已有的函数或变量而实现,但是,原软件程序与补丁程序是分别独立编写并且各自分别进行编译链接得到的,补丁程序无法调用原软件程序中的函数,从而在补丁程序中不得不重新实现原软件程序中已有的函数或变量,由此导致补丁程序代码量较大,严重影响补丁程序编译效率以及软件程序修补效率。
发明内容
基于上述技术现状,本申请提出一种补丁程序编译方法及装置、一种程序修补方法及装置、电子设备、存储介质,可以使得补丁程序能够调用原程序中的函数或引用原程序中的变量,从而提升补丁编译效率以及提升软件程序修补效率。
为了实现上述目的,本申请具体提出如下技术方案:
一种补丁程序编译方法,包括:
获取目标符号信息,所述目标符号信息中包含目标程序中的函数的名称信息和地址信息,和/或包含目标程序中的变量的名称信息和地址信息;
对补丁程序进行编译处理,所述补丁程序中包含调用所述目标程序中的函数的程序代码,和/或包含引用所述目标程序中的变量的程序代码;
根据所述目标符号信息,对编译后的所述补丁程序进行链接处理,使所述补丁程序链接至所述目标程序中的函数和/或变量。
可选的,所述补丁程序中包括程序初始化函数,用于对所述补丁程序进行初始化,以及将所述补丁程序中的函数地址与所述目标程序中的待修补函数的函数指针变量绑定。
可选的,所述获取目标符号信息,包括:
从目标程序的编译结果中获取目标程序的符号文件,所述符号文件中至少包括所述目标程序中的各个函数和/或变量的名称,以及各个函数和/或变量的地址;
根据所述符号文件,生成目标符号信息。
可选的,根据所述目标符号信息,对编译后的所述补丁程序进行链接处理,包括:
利用所述目标符号信息,对所述补丁程序的链接脚本文件进行更新;
利用更新后的链接脚本文件,对编译后的所述补丁程序进行链接处理。
一种程序修补方法,包括:
当目标程序启动运行时,判断设定存储地址是否存储有效的目标补丁程序;
其中,所述目标补丁程序中包含调用所述目标程序中的函数的程序代码,和/或包含引用所述目标程序中的变量的程序代码,并且,所述目标补丁程序根据目标符号信息进行链接处理得到,所述目标符号信息中包含所述目标程序中的函数的名称信息和地址信息,和/或包含所述目标程序中的变量的名称信息和地址信息;
如果所述设定存储地址存储有效的目标补丁程序,则利用该目标补丁程序对所述目标程序进行修补。
可选的,所述目标补丁程序包括程序初始化函数,用于对所述目标补丁程序进行初始化,以及将所述目标补丁程序中的函数地址与所述目标程序中的待修补函数的函数指针变量绑定;
其中,有效的目标补丁程序中的所述程序初始化函数的入口地址为所述设定存储地址。
可选的,所述判断设定存储地址是否存储有效的目标补丁程序,包括:
检测在设定存储地址处,是否有目标补丁程序的程序初始化函数的入口地址为所述设定存储地址;
如果有目标补丁程序的程序初始化函数的入口地址为所述设定存储地址,则确定所述设定存储地址存储有效的目标补丁程序。
可选的,所述目标程序中的待修补函数入口预先设置有函数指针变量;
所述利用该目标补丁程序对所述目标程序进行修补,包括:
设置所述目标程序中的待修补函数入口处的函数指针变量,指向该目标补丁程序中的函数地址。
可选的,所述设置所述目标程序中的待修补函数入口处的函数指针变量,指向所述目标补丁程序中的函数地址,包括:
通过调用所述目标补丁程序中的程序初始化函数,确定所述目标补丁程序中的函数地址与所述目标程序中的待修补函数的函数指针变量的绑定关系;
根据所述目标补丁程序中的函数地址与所述目标程序中的待修补函数的函数指针变量的绑定关系,调整所述目标程序中的待修补函数入口处的函数指针变量,指向与其绑定的所述目标补丁程序中的函数地址。
一种补丁程序编译装置,包括:
信息获取单元,用于获取目标符号信息,所述目标符号信息中包含目标程序中的函数的名称信息和地址信息,和/或包含目标程序中的变量的名称信息和地址信息;
编译处理单元,用于对补丁程序进行编译处理,所述补丁程序中包含调用所述目标程序中的函数的程序代码,和/或包含引用所述目标程序中的变量的程序代码;
链接处理单元,用于根据所述目标符号信息,对编译后的所述补丁程序进行链接处理,使所述补丁程序链接至所述目标程序中的函数和/或变量。
一种程序修补装置,包括:
判断处理单元,用于当目标程序启动运行时,判断设定存储地址是否存储有效的目标补丁程序;
其中,所述目标补丁程序中包含调用所述目标程序中的函数的程序代码,和/或包含引用所述目标程序中的变量的程序代码,并且,所述目标补丁程序根据目标符号信息进行链接处理得到,所述目标符号信息中包含所述目标程序中的函数的名称信息和地址信息,和/或包含所述目标程序中的变量的名称信息和地址信息;
修补处理单元,用于当所述设定存储地址存储有效的目标补丁程序时,利用该目标补丁程序对所述目标程序进行修补。
一种电子设备,包括:
存储器和处理器;
其中,所述存储器与所述处理器连接,用于存储程序;
所述处理器,用于通过运行所述存储器中的程序,实现上述的补丁程序编译方法或程序修补方法。
一种存储介质,所述存储介质上存储有计算机程序,所述计算机程序被处理器运行时,实现上述的补丁程序编译方法或程序修补方法。
本申请提出的补丁程序编译方法,能够利用包含目标程序中的函数和函数地址,和/或包含目标程序中的变量和变量地址的目标符号信息,对包含调用目标程序中的函数或引用目标程序中的变量的程序代码的补丁程序进行编译和链接处理,使得该补丁程序能够链接至目标程序的函数或变量,从而使得该补丁程序能够顺利地调用目标程序中的函数或引用目标程序中的变量。将上述方案应用于目标程序升级或修补中,可以大大降低补丁程序代码量,提高程序修补或升级的效率。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1是本申请实施例提出的一种补丁程序编译方法的流程示意图;
图2是本申请实施例提供的一种程序编译过程示意图;
图3是本申请实施例提供的另一种程序编译过程示意图;
图4是本申请实施例提供的一种程序修补方法的流程示意图;
图5是本申请实施例提供的函数运行过程示意图;
图6是本申请实施例提供的目标程序运行过程示意图;
图7是本申请实施例提供的一种补丁程序编译装置的结构示意图;
图8是本申请实施例提供的一种程序修补装置的结构示意图;
图9是本申请实施例提供的一种电子设备的结构示意图。
具体实施方式
本申请实施例提出技术方案适用于软件程序修补或升级的应用场景中,采用本申请实施例技术方案,使得补丁程序能够调用原程序中的函数或变量,从而可以减少补丁程序的代码量,利于提升补丁程序编译效率以及提升软件程序修补效率或升级效率。
随着科技进步,软件程序在各种产品、各种场景中的应用越来越广泛。软件程序结合硬件设施的搭配使得人们的生活不断迈向智能化。与此同时,随着人们对智能化产品的功能和性能的要求不断增长,时常产生需要对软件程序进行修补或升级的情况。
例如,嵌入式软件、SOC(System on Chip,系统级芯片)芯片和其他周边硬件构成一个嵌入式系统,嵌入式系统应用很广,遍布在我们身边的各个角落,例如:电饭煲、洗衣机、手机、智能手环、公交卡、门禁卡、电表、智能玩具、汽车、红绿灯、电梯等等。在如此之多的应用场景中,嵌入式软件都发挥了巨大的作用。根据各种应用场景的需要,嵌入式软件有时有修补的需要,例如进行软件升级、增加功能或修补漏洞等等。
目前的软件程序修补通常采用两种方式,一种是整体升级模式,另一种是补丁修补升级模式。
整体升级模式需要对原软件程序整体进行更新,因此当固件比较大时,升级会比较慢,大批量升级时的效率较低,成本高。
补丁修补升级模式能够弥补上述缺点,补丁修补升级目前有两种主要实现方式:硬件实现和软件实现。
其中,硬件实现是在硬件MCU(Microcontroller Unit,微控制单元)或BUS(总线)中预留硬件逻辑来实现补丁函数的重新映射。这种方式有较多的限制,比如,如果事先在硬件里留了4个补丁点,要想在第5个地方打补丁就困难了。
软件实现方式是最常用的补丁升级或补丁修补实现方式。在原软件程序中预留补丁点,通过补丁点调用补丁程序,即可实现对原软件程序的补丁修复或升级。
本申请实施例提出的技术方案,也是针对上述的软件实现方式下的软件程序打补丁场景而提出的。
当通过对原软件程序打补丁时,补丁程序中的某些功能需要依托原软件程序中已有的函数或变量而实现,但是,原软件程序与补丁程序是分别独立编写并且各自分别进行编译链接得到的,补丁程序无法调用原软件程序中的函数,从而在补丁程序中不得不重新实现原软件程序中已有的函数或变量,由此导致补丁程序代码量较大,严重影响补丁程序编译效率以及软件程序修补效率。而且,将重复的函数或变量补入原软件程序,会使得原软件程序代码冗余,体量过大。
为解决上述技术问题,本申请实施例提出一种补丁程序编译方法、一种程序修补方法,以及相关的装置、设备和存储介质,本申请实施例技术方案使得补丁程序能够调用原程序中的函数或引用原程序中的变量,从而能够减少补丁程序代码量,以及提高程序修补效率。
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
本申请实施例提出一种补丁程序编译方法,参见图1所示,该方法包括:
S101、获取目标符号信息,所述目标符号信息中包含目标程序中的函数的名称信息和地址信息,和/或包含目标程序中的变量的名称信息和地址信息。
具体的,上述的目标程序,具体是指需要利用补丁程序对其进行修补或升级的程序,即相对于补丁程序而言的原程序。其具体可以是任意类型、基于任意语言编写的软件程序。
上述的目标符号信息,是指目标程序中的符号的相关信息。其中,目标程序中的符号,是指目标程序中的函数或变量;目标程序中的符号的相关信息,至少包括目标程序中的函数或变量的名称信息和地址信息,此外,还可以包括目标程序中的函数或变量的类型信息,以及函数或变量在目标程序的源文件中的位置,例如在目标程序源文件中的行号等。
本申请实施例从目标程序的编译结果中,提取上述的目标符号信息。具体是先提取函数或变量的名称信息,然后确定函数或变量的其他信息,例如地址信息、类型信息、在源文件中的位置信息等,最终汇总各个函数或变量的信息,作为上述的目标符号信息,在该目标符号信息中,至少要包含函数名称信息,以及每个函数的地址信息,以及包含变量的名称信息,以及每个变量的地址信息。
S102、对补丁程序进行编译处理,所述补丁程序中包含调用所述目标程序中的函数的程序代码,和/或包含引用所述目标程序中的变量的程序代码。
具体的,上述的补丁程序,是指用于对步骤S101中的目标程序进行修补或升级的补丁程序。将该补丁程序补入上述的目标程序,可以实现对目标程序的升级,或者修补目标程序中存在的漏洞,从而使目标程序功能更完善。
由于上述的补丁程序是用于对上述的目标程序进行修补或升级的补丁程序,因此该补丁程序中的某些功能其实是与目标程序中的某些功能相同或相应的,例如补丁程序的某些功能是与目标程序中的某些功能相同的功能,或者是在目标程序中所实现的功能的基础上进一步改进或升级、完善后的功能。而通常情况下,在同一种程序语言中,相同或相应功能的实现方式是相同的,比如用于实现相同或相应功能的函数、变量等,都是相同的。
在现有的程序打补丁实现方案中,为了在补丁程序中实现与原程序相同或相应的功能,需要在补丁程序中重新实现原程序中用于实现相同或相应功能的函数、变量,由此导致补丁程序的体量较大,需要开发人员编写大量程序代码,同时会降低程序修补效率。
而本申请实施例则采用函数或变量调用的方式,使补丁程序实现与目标程序相同或相应的功能。
具体的,当补丁程序中需要实现与目标程序中相同或相应的功能时,在需要实现这些功能的程序位置处编写调用目标程序中的用于实现这些功能的函数的程序代码,或者编写引用目标程序中的用于实现这些功能的变量的程序代码。这样,当补丁程序运行到这些调用程序代码时,其会主动调用目标程序中的相应函数,或者引用目标程序中的相应变量,从而实现目标程序中的被调用函数或被引用变量所实现的功能。
示例性的,上述的补丁程序中的调用目标程序中的函数的程序代码,或者引用目标程序中的变量的程序代码,可以由软件开发人员在编写补丁程序代码时写入补丁程序。
上述的补丁程序编写完成后,对其进行编译处理。可以理解,编译工具的选取,应当与补丁程序的编写语言相适应,即编译工具要能够编译补丁程序的程序代码。示例性的,在嵌入式软件系统中,嵌入式软件以及软件补丁通常是基于C语言编写的,此时,可以通过GCC(GNU Compiler Collection,GNU编译器套件)对上述补丁程序进行编译处理。
S103、根据所述目标符号信息,对编译后的所述补丁程序进行链接处理,使所述补丁程序链接至所述目标程序中的函数和/或变量。
通常情况下,一段程序要想投入实际应用,需要依次经过编译和链接处理。相应的,在编译工具中,分别具有编译器和链接器,分别用于对程序进行编译处理和链接处理。
以GCC为例,其中的编译器把单个的C文件编译成机器码,对于多个文件之间的变量引用和函数调用只是暂时做了标记。链接器把编译过程产生的多个机器码文件合成一个统一的机器码文件,把编译阶段标记的变量和函数替换成真实的变量地址和函数地址。
市面上常见的编译工具一次只能对一个程序进行编译,比如对于上述的目标程序和补丁程序来说,在编译阶段,需要利用编译工具分别对目标程序进行编译和链接处理,以及对补丁程序进行编译和链接处理。
由于编译工具一次只能对一个程序进行编译,因此,其编译器和链接器所有的处理均是针对同一个程序所进行的处理,例如使同一个程序内部的各函数和各变量之间形成引用关系,其并不能使不同的程序之间产生调用或引用关系。
因此,要想使一个程序调用另一个程序,就必须使调用的程序与被调用的程序之间形成引用关系,以及使调用的程序能够获取被调用的程序的地址信息。例如,要想使补丁程序调用目标程序中的函数或引用目标程序中的变量,就必须使补丁程序能够获取目标程序中的函数或变量的地址信息。
为了使补丁程序获取目标程序中的函数或变量的地址信息,本申请实施例通过上述步骤S101获取上述的目标符号信息,以及通过执行步骤S102对调用目标程序的补丁程序进行编译后,利用编译工具的链接器,根据上述的目标符号信息,对编译后的上述补丁程序进行链接处理,使上述的补丁程序链接至上述目标程序中的函数和/或变量。
具体的,基于上述的链接器的功能,根据上述的目标符号信息对上述补丁程序进行链接处理,使补丁程序文件与上述的目标符号信息相结合,就可以在链接器的链接处理过程中把补丁程序中的对目标程序的引用标记和调用标记替换成真实的地址,这样就可以使补丁程序调用目标程序中的函数或引用目标程序中的变量。
通过上述介绍可见,本申请实施例提出的补丁程序编译方法,能够利用包含目标程序中的函数和函数地址,和/或包含目标程序中的变量和变量地址的目标符号信息,对包含调用目标程序中的函数或引用目标程序中的变量的程序代码的补丁程序进行编译和链接处理,使得该补丁程序能够链接至目标程序的函数或变量,从而使得该补丁程序能够顺利地调用目标程序中的函数或引用目标程序中的变量。将上述方案应用于目标程序升级或修补中,可以大大降低补丁程序代码量,提高程序修补或升级的效率。
作为一种示例性的实现方式,为了保证补丁程序能够调用目标程序中的函数,和/或引用目标程序中的变量,本申请实施例在上述的补丁程序中设置程序初始化函数,用于对补丁程序进行初始化,以及将补丁程序中的函数地址与目标程序中的待修补函数的函数指针变量绑定。
具体的,本申请实施例在用于对上述目标程序进行修补的上述补丁程序中实现Patch_init()函数,该Patch_init()函数用于对补丁程序进行初始化,具体是赋值或清零补丁程序中必要的变量,该Patch_init()函数还用于将补丁程序中的函数地址与目标程序中的待修补函数的函数指针变量绑定。
在目标程序中,针对有可能会需要进行修补的位置处的函数内,预先定义函数指针类型,以及声明函数指针变量,例如下面的函数伪代码:
typedef int(*do_something_t)(int param1,int param2);/*定义函数指针类型*/
volatile do_something_t do_something_pat=NULL;/*定义函数指针变量*/
int do_something(int param1,int param2)
{
/*判断指针,调用函数*/
if(do_something_pat)return do_something_pat(param1,param2);
}
在上述的目标程序中的函数入口处,定义了函数指针类型以及函数指针变量,只要该函数指针指向补丁程序中的函数,即可使得该函数调用补丁程序中的函数运行。
相应的,在补丁程序中通过Patch_init()函数实现补丁程序中的函数地址与目标程序中的待修补函数的函数指针变量绑定,该Patch_init()函数的伪代码如下:
Figure BDA0003162436610000101
Figure BDA0003162436610000111
可见,该Patch_init()函数通过将补丁函数地址赋值给目标程序中的待修补函数的函数指针变量,从而实现补丁函数地址与目标程序中的待修补函数的函数指针变量的绑定。
作为一种可选的实现方式,上述的获取目标符号信息,可以通过执行如下步骤A1-A2实现:
A1、从目标程序的编译结果中获取目标程序的符号文件,所述符号文件中至少包括所述目标程序中的各个函数和/或变量的名称,以及各个函数和/或变量的地址。
具体的,一般的编译器都提供获取程序的符号表的方法,例如对于ARM平台可以使用arm-none-eabi-nm命令来获取目标程序的符号表,也就是获取目标程序的符号文件,具体获取的文件内容如下:
00004144 T do_something D:\resource\projects\main.c:88
00004254 T dev_init D:\resource\projects\device.c:15
00010098 D SystemCoreClock
0001009c D do_something_pat D:\resource\projects\main.c:80
其中,每行的第1项是地址,第2项是符号类型(T代表代码段函数,D代表数据段变量),第3项是符号名称(函数名或变量名),第4项是符号所在的源文件和行号(这一项可能为空)。
A2、根据所述符号文件,生成目标符号信息。
具体的,从上述的符号文件中,提取各个符号名称,以及符号名称对应的地址,也就是提取各个函数名或变量名,以及提取各个函数名或变量名的地址,组合得到目标符号信息。
作为可选的实施方式,本申请实施例将上述符号文件中的每一个符号和符号对应的地址,用“=”连接起来,得到目标符号信息如下:
Figure BDA0003162436610000121
进一步的,将上述的包含符号文件中的符号名和地址的目标符号信息,转成链接器可以识别的链接脚本,并放到“SECTIONS”中作为一个符号片段,具体形式如下:
Figure BDA0003162436610000122
Figure BDA0003162436610000131
上述链接脚本中第一个“SECTIONS”中是从目标程序中获取的目标符号信息,第二个“SECTIONS”中是补丁程序的内容。注意.EXEC_PATCH和.INIT_PATCH与前面补丁程序的Patch_init()函数中的attribute定义的一致。补丁程序编译时指向这个链接脚本就可以顺利的编译了。从符号表到链接脚本的转换可以手动进行,也可以编写简单的程序进行。
示例性的,上述的根据目标符号信息,对编译后的补丁程序进行链接处理,具体可以通过执行如下步骤B1-B2实现:
B1、利用所述目标符号信息,对所述补丁程序的链接脚本文件进行更新。
具体的,正常的编译工具只能对一个程序进行编译和链接处理,例如对待修补的原程序的编译过程如图2所示。
由图2可见,正常的编译工具只能一次对一个程序进行编译,为了使补丁程序能够链接至其所调用的目标程序中的函数或变量,本申请实施例采用图3所示的方式对补丁程序进行编译和连接处理。
其中,图3中的“or.elf”表示编译后的目标程序,“symbol”表示从目标程序中获取的上述的目标符号信息。
在编译工具对补丁程序进行链接处理阶段,将从目标程序中获取的目标符号信息,存储至补丁程序的连接脚本文件中,从而实现对补丁程序的链接脚本文件的更新。
例如,将上述的包含目标符号信息的“SECTIONS”符号片段添加至补丁程序的ldscript文件内容的前面,使得补丁程序的链接脚本文件中包含目标程序的符号信息。
B2、利用更新后的链接脚本文件,对编译后的所述补丁程序进行链接处理。
具体的,编译器基于补丁程序的经过上述更新后的链接脚本文件,对编译后的补丁程序进行链接处理,就可以使补丁程序中对目标程序的引用标记或调用标记替换成目标程序中的变量或函数的真实地址,即使编译后的补丁程序链接至目标程序中的函数和/或变量。
基于上述的补丁程序编译方法,本申请实施例还提出一种程序修补方法,参见图4所示,该方法包括:
当目标程序启动运行时,执行步骤S401、判断设定存储地址是否存储有效的目标补丁程序;
其中,所述目标补丁程序中包含调用所述目标程序中的函数的程序代码,和/或包含引用所述目标程序中的变量的程序代码,并且,所述目标补丁程序根据目标符号信息进行链接处理得到,所述目标符号信息中包含所述目标程序中的函数的名称信息和地址信息,和/或包含所述目标程序中的变量的名称信息和地址信息;
如果所述设定存储地址存储有效的目标补丁程序,则执行步骤S402、利用该目标补丁程序对所述目标程序进行修补。
具体的,上述的目标程序,即为需要进行修补或者需要进行升级的程序。
本申请实施例预先设定,当需要对目标程序进行修补或升级时,将有效的补丁程序存储至设定存储地址。并且,在该设定存储地址处设置存储内容标签,以表示在该存储地址所存储的内容。例如,当将目标补丁程序存储至上述的设定存储地址后,在该设定存储地址处设置目标补丁程序标签,以表示在该地址处存储的是目标补丁程序。
当目标程序开始运行时,首先执行判断处理,具体是判断在上述的设定存储地址处,是否存储有效的目标补丁程序。例如,读取该设定存储地址处的存储内容标签,判断在该设定存储地址处存储的是否为目标补丁程序。
其中,上述的目标补丁程序,是包含调用目标程序中的函数的程序代码,和/或包含引用目标程序中的变量的程序代码的补丁程序,并且,该补丁程序是通过上述的补丁程序编译方法而进行编译和链接处理得到的。
即,上述的目标补丁程序,是能够调用目标程序中的函数,和/或引用目标程序中的变量的补丁程序。
如果在上述设定的存储地址处存储有效的目标补丁程序,则说明需要对目标程序进行修补或升级,因此,利用该目标补丁程序对目标程序进行修补。
如果在上述设定存储地址处没有存储有效的目标补丁程序,则说明不需要对目标程序进行修补或升级,此时执行步骤S403、目标程序执行原有的应用逻辑。
通过上述介绍可见,由于上述的目标补丁程序中包含调用目标程序中的函数的程序代码,或者包含引用目标程序中的变量的程序代码,而且该目标补丁程序是基于包含目标程序中的函数的名称信息和地址信息,和/或包含目标程序中的变量的名称信息和地址信息的目标符号信息而编译和链接得到的,因此,利用该目标补丁程序对目标程序进行修补,可以使目标补丁程序的代码量更小,同时使得修补后的目标程序的代码量更小,从而提高程序修补或升级的效率。
作为一种可选的实现方式,为了保证上述的目标补丁程序能够调用目标程序中的函数,和/或引用目标程序中的变量,本申请实施例在上述的目标补丁程序中设置程序初始化函数,用于对目标补丁程序进行初始化,以及将目标补丁程序中的函数地址与目标程序中的待修补函数的函数指针变量绑定。
具体的,本申请实施例在用于对上述目标程序进行修补的上述目标补丁程序中实现Patch_init()函数,该Patch_init()函数用于对目标补丁程序进行初始化,具体是赋值或清零目标补丁程序中必要的变量,该Patch_init()函数还用于将目标补丁程序中的函数地址与目标程序中的待修补函数的函数指针变量绑定。
上述的Patch_init()函数的具体内容可参见上述实施例介绍。
本申请实施例设定,当上述的目标补丁程序用于对目标程序进行修补时,将该目标补丁程序存储至上述的设定存储地址,并且,将该目标补丁程序中的程序初始化函数Patch_init()的入口地址设置为上述的设定存储地址。
基于上述设置,当判断在设定存储地址是否存储有效的目标补丁程序时,可以检测在设定存储地址处,是否有目标补丁程序的程序初始化函数的入口地址为该设定存储地址。
如果有目标补丁程序的程序初始化函数的入口地址为该设定存储地址,则确定在该设定存储地址存储有效的目标补丁程序。
否则,确定在该设定存储地址未存储有效的目标补丁程序。
具体的,读取在设定存储地址处存储的目标补丁程序的程序初始化函数的入口地址,如果其入口地址为该设定存储地址,则可以确定该目标补丁程序为有效的目标补丁程序;如果其入口地址为空或者为其他存储地址,则可以确定该目标补丁程序不是有效的目标补丁程序。
作为一种示例性的实施方式,本申请实施例预先在目标程序的待修补函数入口设置函数指针变量。该函数指针变量用于使目标程序函数调用该函数指针变量所指向的地址的函数,当该目标程序函数指针变量指向补丁程序内部的函数地址时,其可以使该目标程序函数调用该补丁函数,实现利用补丁程序对目标程序进行修补,故,该函数指针变量又可称为补丁函数指针。
需要注意的是,由于上述的设置函数指针变量的处理是在编写目标程序的时候处理的,此时目标程序尚未投入运行,因此可能不知道哪些函数是需要修补的函数,此时,可以将可能发生问题或可能有升级需求的函数,均作为补丁点,也就是作为上述的待修补函数,然后在确定的各个待修补函数的入口分别预先定义函数指针类型以及函数指针变量。在资源允许的情况下,可以设置尽量多的待修补函数,这样可以保证在目标程序运行过程中,任何的函数需要修补或升级时,均可以在编写补丁程序时,将需要修补或升级的函数的函数指针变量指向补丁函数,而实现修补或升级。
基于上述的在目标程序的函数入口处设置函数指针变量,以及在目标补丁程序内设置程序初始化函数的处理,本申请实施例提出的程序修补方法在利用目标补丁程序对目标程序进行修补时,具体可以通过设置目标程序中的待修补函数入口处的函数指针变量,指向目标补丁程序中的函数地址,而实现。
具体的,当目标程序中的函数不需要修补或升级时,其入口处的函数指针变量(补丁函数指针)指向为NULL(即指向为空),此时可以认为该补丁函数指针无效。当需要对目标程序中的函数进行修补或升级时,设置目标程序中的待修补函数入口处的函数指针变量(补丁函数指针)指向目标补丁程序中的函数地址,此时该补丁函数指针有效。
当目标程序的函数运行时,在其入口处先判断补丁函数指针是否有效,如果无效,则函数执行原函数操作,如果有效,则调用补丁函数指针所指向的目标补丁程序函数。
上述过程可参见图5所示。
进一步的,由上述的在目标补丁程序中预先设置的程序初始化函数可知,在该程序初始化函数Patch_init()内部实现了目标补丁程序函数地址与目标程序中的待修补函数的函数指针变量的绑定。因此,可以借助目标补丁程序中的程序初始化函数Patch_init()实现补丁函数调用。即,上述的设置目标程序中的待修补函数入口处的函数指针变量(补丁函数指针)指向目标补丁程序中的函数地址,可以通过调用目标补丁程序的Patch_init()函数获取目标补丁程序函数的地址,进而使待修补函数入口处的补丁函数指针指向该目标补丁函数地址。
具体的,上述的程序修补方法的具体处理过程可参见图6所示:
当目标程序启动运行时,先读取设定存储地址处的目标补丁程序的Patch_init()函数的入口地址,判断目标补丁程序的Patch_init()函数的入口地址是否有效,如果有效,则说明在设定存储地址处存储有效的目标补丁程序,即确定需要对目标补丁程序中的某些函数进行修补或升级。
此时,目标程序调用目标补丁程序的Patch_init()函数,通过解析该Patch_init()函数,从中确定目标补丁程序中的函数地址与目标程序中的待修补函数的函数指针变量的绑定关系。
然后,根据目标补丁程序中的函数地址与目标程序中的待修补函数的函数指针变量的绑定关系,调整目标程序中的待修补函数入口处的函数指针变量,指向与其绑定的目标补丁程序中的函数地址。
例如,假设从目标补丁程序的Patch_init()函数中解析得到目标补丁程序中的A函数的地址与目标程序中的函数X的函数指针变量相绑定,则可以确定,目标程序中的函数X需要修补或更新,并且需要利用目标补丁程序中的A函数对目标程序中的函数X进行修补或更新。此时,目标程序将内部的函数X入口处的函数指针变量,指向目标补丁程序中的A函数的地址。则,当目标程序运行到函数X时,该函数X在入口处可判断确定其函数指针变量有效,因此不再运行原有函数内容,而是调用其函数指针变量指向的函数,即调用目标补丁程序中的A函数,从而实现对函数X的修补或升级。
如果目标程序在入口处判断确定了目标补丁程序的Patch_init()函数的入口地址无效,则可以确定不需要对目标程序进行修补或升级,此时执行目标程序原有应用逻辑。
通过上述介绍可以理解,本申请实施例通过在目标程序函数入口预先设置补丁函数指针,以及在补丁程序中设置程序初始化函数Patch_init(),实现对目标程序打补丁。该程序修补方式使得在目标程序中不论预留了多少个补丁点,即不论在目标程序的多少个函数的入口处定义了补丁函数指针,在补丁程序中,也只需要一个Patch_init()函数即可实现补丁函数对任意补丁点的修补,从而使得补丁程序与补丁点个数无关。比如,不论原程序中有多少个补丁点,只要在Patch_init()函数中定义待修补函数与补丁函数的绑定关系,即可通过使目标程序中的待修补函数调用补丁函数,实现对待修补函数的修补。
在常规的程序修补方案中,原程序和补丁程序都要保留一份相同的函数列表,列表中的函数是所有需要修补的函数。随着待修补函数的增加,这2个列表也不断增加,不但增加了内存的使用量,而且造成补丁程序严重依赖原程序(原程序后门函数改变,补丁程序也跟着改)。而本申请实施例技术方案,则彻底打破了补丁程序与原程序的依赖关系。在原程序中可以任意设置补丁点,也就是可以在原程序任意函数入口均设置函数指针变量,当需要对原程序进行修补时,只需要在补丁程序的Patch_init()函数中定义待修补函数与补丁函数的绑定关系即可。
比如,假设在编写目标程序代码时,在其中的100个函数入口处均定义了函数指针变量,也就是定义了补丁函数指针。在目标程序实际运行过程中,发现需要对其中的某3个函数进行修补或更新,那么,开发人员只需要编写补丁程序,并且在编写的补丁程序的Patch_init()函数中定义这3个需要修补或更新的函数、与补丁程序中的用于对这3个需要修补或更新的函数进行修补或更新的补丁函数地址之间的绑定关系即可。然后将补丁程序存储至设定存储地址,以及将该补丁程序的Patch_init()函数入口地址设置为该设定存储地址,这样,当目标程序启动运行时,判断设定存储地址处的补丁程序的Patch_init()函数入口地址有效,则调用该Patch_init()函数,获取其中的待修补函数与补丁函数地址的绑定关系,然后将这3个需要修补或更新的函数入口处的补丁函数指针指向与其绑定的补丁函数地址,此时这3个需要修补或更新的函数就会调用补丁程序中的相应补丁函数,从而实现对这3个函数的修补或更新。
本申请实施例提出的程序修补方法,不仅可以使补丁程序调用原程序的函数或引用原程序的变量,从而减少补丁程序代码量,还能够使程序修补更灵活,打破补丁程序与补丁点之间的严重依赖关系,从而进一步简化补丁程序,减轻编程人员工作量,以及提升程序修补效率。
进一步的,由于本申请实施例实现了补丁点与补丁程序的依赖关系分离,为了保证目标程序中的大量补丁点的安全性,可以通过数字签名验签的方式验证补丁程序的合法性,从而保证目标程序中的补丁点的安全性。即,目标程序读取到有效的目标补丁程序时,先通过签名验签的方式判断目标补丁程序是否安全,如果安全,再利用目标补丁程序进行函数修补。
另外,由于补丁点是在原程序编写时就预留的,而并非在实际需要时才布置的,因此,在对原程序进行编译时,要选择合适的编译选项,避免一些预置了补丁点(即预先定义了函数指针变量)的函数或变量被优化掉,导致这些被优化掉的函数或变量在后期无法打补丁。
本申请实施例提出的补丁程序编译方法以及程序修补方法,尤其适用于无操作者系统或各种RTOS(Real Time Operating System,实时操作系统)操作系统的嵌入式平台,因为在linux或windows这些操作系统中应用程序运行地址是kernel分配的虚拟地址,不需要编译时指定链接脚本。
本申请实施例还提出一种补丁程序编译装置,参见图7所示,该装置包括:
信息获取单元001,用于获取目标符号信息,所述目标符号信息中包含目标程序中的函数的名称信息和地址信息,和/或包含目标程序中的变量的名称信息和地址信息;
编译处理单元002,用于对补丁程序进行编译处理,所述补丁程序中包含调用所述目标程序中的函数的程序代码,和/或包含引用所述目标程序中的变量的程序代码;
链接处理单元003,用于根据所述目标符号信息,对编译后的所述补丁程序进行链接处理,使所述补丁程序链接至所述目标程序中的函数和/或变量。
可选的,所述补丁程序中包括程序初始化函数,用于对所述补丁程序进行初始化,以及将所述补丁程序中的函数地址与所述目标程序中的待修补函数的函数指针变量绑定。
可选的,所述获取目标符号信息,包括:
从目标程序的编译结果中获取目标程序的符号文件,所述符号文件中至少包括所述目标程序中的各个函数和/或变量的名称,以及各个函数和/或变量的地址;
根据所述符号文件,生成目标符号信息。
可选的,根据所述目标符号信息,对编译后的所述补丁程序进行链接处理,包括:
利用所述目标符号信息,对所述补丁程序的链接脚本文件进行更新;
利用更新后的链接脚本文件,对编译后的所述补丁程序进行链接处理。
具体的,上述的补丁程序编译装置的各个单元的具体工作内容,请参见上述方法实施例的内容,此处不再赘述。
本申请实施例还提出一种程序修补装置,参见图8所示,该装置包括:
判断处理单元010,用于当目标程序启动运行时,判断设定存储地址是否存储有效的目标补丁程序;
其中,所述目标补丁程序中包含调用所述目标程序中的函数的程序代码,和/或包含引用所述目标程序中的变量的程序代码,并且,所述目标补丁程序根据目标符号信息进行链接处理得到,所述目标符号信息中包含所述目标程序中的函数的名称信息和地址信息,和/或包含所述目标程序中的变量的名称信息和地址信息;
修补处理单元011,用于当所述设定存储地址存储有效的目标补丁程序时,利用该目标补丁程序对所述目标程序进行修补。
可选的,所述目标补丁程序包括程序初始化函数,用于对所述目标补丁程序进行初始化,以及将所述目标补丁程序中的函数地址与所述目标程序中的待修补函数的函数指针变量绑定;
其中,有效的目标补丁程序中的所述程序初始化函数的入口地址为所述设定存储地址。
可选的,所述判断设定存储地址是否存储有效的目标补丁程序,包括:
检测在设定存储地址处,是否有目标补丁程序的程序初始化函数的入口地址为所述设定存储地址;
如果有目标补丁程序的程序初始化函数的入口地址为所述设定存储地址,则确定所述设定存储地址存储有效的目标补丁程序。
可选的,所述目标程序中的待修补函数入口预先设置有函数指针变量;
所述利用该目标补丁程序对所述目标程序进行修补,包括:
设置所述目标程序中的待修补函数入口处的函数指针变量,指向该目标补丁程序中的函数地址。
可选的,所述设置所述目标程序中的待修补函数入口处的函数指针变量,指向所述目标补丁程序中的函数地址,包括:
通过调用所述目标补丁程序中的程序初始化函数,确定所述目标补丁程序中的函数地址与所述目标程序中的待修补函数的函数指针变量的绑定关系;
根据所述目标补丁程序中的函数地址与所述目标程序中的待修补函数的函数指针变量的绑定关系,调整所述目标程序中的待修补函数入口处的函数指针变量,指向与其绑定的所述目标补丁程序中的函数地址。
具体的,上述的程序修补装置的各个单元的具体工作内容,请参见上述方法实施例的内容,此处不再赘述。
本申请另一实施例还提出一种电子设备,参见图9所示,该设备包括:
存储器200和处理器210;
其中,所述存储器200与所述处理器210连接,用于存储程序;
所述处理器210,用于通过运行所述存储器200中存储的程序,实现上述任一实施例公开的补丁程序编译方法或程序修补方法。
具体的,上述电子设备还可以包括:总线、通信接口220、输入设备230和输出设备240。
处理器210、存储器200、通信接口220、输入设备230和输出设备240通过总线相互连接。其中:
总线可包括一通路,在计算机系统各个部件之间传送信息。
处理器210可以是通用处理器,例如通用中央处理器(CPU)、微处理器等,也可以是特定应用集成电路(application-specific integrated circuit,ASIC),或一个或多个用于控制本发明方案程序执行的集成电路。还可以是数字信号处理器(DSP)、专用集成电路(ASIC)、现成可编程门阵列(FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。
处理器210可包括主处理器,还可包括基带芯片、调制解调器等。
存储器200中保存有执行本发明技术方案的程序,还可以保存有操作系统和其他关键业务。具体地,程序可以包括程序代码,程序代码包括计算机操作指令。更具体的,存储器200可以包括只读存储器(read-only memory,ROM)、可存储静态信息和指令的其他类型的静态存储设备、随机存取存储器(random access memory,RAM)、可存储信息和指令的其他类型的动态存储设备、磁盘存储器、flash等等。
输入设备230可包括接收用户输入的数据和信息的装置,例如键盘、鼠标、摄像头、扫描仪、光笔、语音输入装置、触摸屏、计步器或重力感应器等。
输出设备240可包括允许输出信息给用户的装置,例如显示屏、打印机、扬声器等。
通信接口220可包括使用任何收发器一类的装置,以便与其他设备或通信网络通信,如以太网,无线接入网(RAN),无线局域网(WLAN)等。
处理器2102执行存储器200中所存放的程序,以及调用其他设备,可用于实现本申请实施例所提供的补丁程序编译方法或程序修补方法的各个步骤。
本申请另一实施例还提供了一种存储介质,该存储介质上存储有计算机程序,该计算机程序被处理器运行时,实现上述任一实施例提供的补丁程序编译方法或程序修补方法的各个步骤。
具体的,上述的电子设备的各个部分的具体工作内容,以及上述的存储介质上的计算机程序被处理器运行时的具体处理内容,均可以参见上述的补丁程序编译方法或程序修补方法的各个实施例的内容,此处不再赘述。
对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本申请并不受所描述的动作顺序的限制,因为依据本申请,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本申请所必须的。
需要说明的是,本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。对于装置类实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
本申请各实施例方法中的步骤可以根据实际需要进行顺序调整、合并和删减,各实施例中记载的技术特征可以进行替换或者组合。
本申请各实施例种装置及终端中的模块和子模块可以根据实际需要进行合并、划分和删减。
本申请所提供的几个实施例中,应该理解到,所揭露的终端,装置和方法,可以通过其它的方式实现。例如,以上所描述的终端实施例仅仅是示意性的,例如,模块或子模块的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个子模块或模块可以结合或者可以集成到另一个模块,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或模块的间接耦合或通信连接,可以是电性,机械或其它的形式。
作为分离部件说明的模块或子模块可以是或者也可以不是物理上分开的,作为模块或子模块的部件可以是或者也可以不是物理模块或子模块,即可以位于一个地方,或者也可以分布到多个网络模块或子模块上。可以根据实际的需要选择其中的部分或者全部模块或子模块来实现本实施例方案的目的。
另外,在本申请各个实施例中的各功能模块或子模块可以集成在一个处理模块中,也可以是各个模块或子模块单独物理存在,也可以两个或两个以上模块或子模块集成在一个模块中。上述集成的模块或子模块既可以采用硬件的形式实现,也可以采用软件功能模块或子模块的形式实现。
专业人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。
结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件单元,或者二者的结合来实施。软件单元可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本申请。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本申请的精神或范围的情况下,在其它实施例中实现。因此,本申请将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。

Claims (13)

1.一种补丁程序编译方法,其特征在于,包括:
获取目标符号信息,所述目标符号信息中包含目标程序中的函数的名称信息和地址信息,和/或包含目标程序中的变量的名称信息和地址信息;
对补丁程序进行编译处理,所述补丁程序中包含调用所述目标程序中的函数的程序代码,和/或包含引用所述目标程序中的变量的程序代码;
根据所述目标符号信息,对编译后的所述补丁程序进行链接处理,使所述补丁程序链接至所述目标程序中的函数和/或变量。
2.根据权利要求1所述的方法,其特征在于,所述补丁程序中包括程序初始化函数,用于对所述补丁程序进行初始化,以及将所述补丁程序中的函数地址与所述目标程序中的待修补函数的函数指针变量绑定。
3.根据权利要求1所述的方法,其特征在于,所述获取目标符号信息,包括:
从目标程序的编译结果中获取目标程序的符号文件,所述符号文件中至少包括所述目标程序中的各个函数和/或变量的名称,以及各个函数和/或变量的地址;
根据所述符号文件,生成目标符号信息。
4.根据权利要求1所述的方法,其特征在于,根据所述目标符号信息,对编译后的所述补丁程序进行链接处理,包括:
利用所述目标符号信息,对所述补丁程序的链接脚本文件进行更新;
利用更新后的链接脚本文件,对编译后的所述补丁程序进行链接处理。
5.一种程序修补方法,其特征在于,包括:
当目标程序启动运行时,判断设定存储地址是否存储有效的目标补丁程序;
其中,所述目标补丁程序中包含调用所述目标程序中的函数的程序代码,和/或包含引用所述目标程序中的变量的程序代码,并且,所述目标补丁程序根据目标符号信息进行链接处理得到,所述目标符号信息中包含所述目标程序中的函数的名称信息和地址信息,和/或包含所述目标程序中的变量的名称信息和地址信息;
如果所述设定存储地址存储有效的目标补丁程序,则利用该目标补丁程序对所述目标程序进行修补。
6.根据权利要求5所述的方法,其特征在于,所述目标补丁程序包括程序初始化函数,用于对所述目标补丁程序进行初始化,以及将所述目标补丁程序中的函数地址与所述目标程序中的待修补函数的函数指针变量绑定;
其中,有效的目标补丁程序中的所述程序初始化函数的入口地址为所述设定存储地址。
7.根据权利要求6所述的方法,其特征在于,所述判断设定存储地址是否存储有效的目标补丁程序,包括:
检测在设定存储地址处,是否有目标补丁程序的程序初始化函数的入口地址为所述设定存储地址;
如果有目标补丁程序的程序初始化函数的入口地址为所述设定存储地址,则确定所述设定存储地址存储有效的目标补丁程序。
8.根据权利要求6所述的方法,其特征在于,所述目标程序中的待修补函数入口预先设置有函数指针变量;
所述利用该目标补丁程序对所述目标程序进行修补,包括:
设置所述目标程序中的待修补函数入口处的函数指针变量,指向该目标补丁程序中的函数地址。
9.根据权利要求8所述的方法,其特征在于,所述设置所述目标程序中的待修补函数入口处的函数指针变量,指向所述目标补丁程序中的函数地址,包括:
通过调用所述目标补丁程序中的程序初始化函数,确定所述目标补丁程序中的函数地址与所述目标程序中的待修补函数的函数指针变量的绑定关系;
根据所述目标补丁程序中的函数地址与所述目标程序中的待修补函数的函数指针变量的绑定关系,调整所述目标程序中的待修补函数入口处的函数指针变量,指向与其绑定的所述目标补丁程序中的函数地址。
10.一种补丁程序编译装置,其特征在于,包括:
信息获取单元,用于获取目标符号信息,所述目标符号信息中包含目标程序中的函数的名称信息和地址信息,和/或包含目标程序中的变量的名称信息和地址信息;
编译处理单元,用于对补丁程序进行编译处理,所述补丁程序中包含调用所述目标程序中的函数的程序代码,和/或包含引用所述目标程序中的变量的程序代码;
链接处理单元,用于根据所述目标符号信息,对编译后的所述补丁程序进行链接处理,使所述补丁程序链接至所述目标程序中的函数和/或变量。
11.一种程序修补装置,其特征在于,包括:
判断处理单元,用于当目标程序启动运行时,判断设定存储地址是否存储有效的目标补丁程序;
其中,所述目标补丁程序中包含调用所述目标程序中的函数的程序代码,和/或包含引用所述目标程序中的变量的程序代码,并且,所述目标补丁程序根据目标符号信息进行链接处理得到,所述目标符号信息中包含所述目标程序中的函数的名称信息和地址信息,和/或包含所述目标程序中的变量的名称信息和地址信息;
修补处理单元,用于当所述设定存储地址存储有效的目标补丁程序时,利用该目标补丁程序对所述目标程序进行修补。
12.一种电子设备,其特征在于,包括:
存储器和处理器;
其中,所述存储器与所述处理器连接,用于存储程序;
所述处理器,用于通过运行所述存储器中的程序,实现如权利要求1至9中任意一项所述的补丁程序编译方法或程序修补方法。
13.一种存储介质,其特征在于,所述存储介质上存储有计算机程序,所述计算机程序被处理器运行时,实现如权利要求1至9中任意一项所述的补丁程序编译方法或程序修补方法。
CN202110794690.2A 2021-07-14 2021-07-14 补丁程序编译方法、程序修补方法及相关设备 Pending CN113504934A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202110794690.2A CN113504934A (zh) 2021-07-14 2021-07-14 补丁程序编译方法、程序修补方法及相关设备

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202110794690.2A CN113504934A (zh) 2021-07-14 2021-07-14 补丁程序编译方法、程序修补方法及相关设备

Publications (1)

Publication Number Publication Date
CN113504934A true CN113504934A (zh) 2021-10-15

Family

ID=78013199

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202110794690.2A Pending CN113504934A (zh) 2021-07-14 2021-07-14 补丁程序编译方法、程序修补方法及相关设备

Country Status (1)

Country Link
CN (1) CN113504934A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113791809A (zh) * 2021-11-11 2021-12-14 腾讯科技(深圳)有限公司 应用异常处理方法、装置以及计算机可读存储介质

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113791809A (zh) * 2021-11-11 2021-12-14 腾讯科技(深圳)有限公司 应用异常处理方法、装置以及计算机可读存储介质

Similar Documents

Publication Publication Date Title
JP3689368B2 (ja) データ処理リソースを備えたマルチアプリケーション組込システムにアプリケーションをローディングする方法、対応するシステムおよび実行方法
US10713024B2 (en) Load module compiler
EP0665496A1 (en) Method and apparatus for run-time error checking using dynamic patching
JP6469028B2 (ja) オペレーティング・システム・リソースに対する機械語のネイティブイメージのアクセス制御のシステム及び方法
US20040015911A1 (en) Translating and executing object-oriented computer programs
JP2000517085A (ja) 安全な装置アドレス指定のための装置および方法
CN106648755B (zh) 一种在安卓art环境中动态加载dex的方法及装置
US11768757B2 (en) Kernel debugging system and method
CN110471663B (zh) 一种代码编译方法、装置及电子设备
US6665671B2 (en) System and method for optimization of shared data
CN114398145A (zh) 基于X86平台的Jailhouse运行non-root Linux的方法
JP2007511816A (ja) 集中daマネージャを用いた動的アドレシング(da)
CN115629971A (zh) 一种应用的开发系统和开发方法
CN102364433B (zh) 在ARM处理器上实现Wine构建工具移植的方法
CN113504934A (zh) 补丁程序编译方法、程序修补方法及相关设备
CN112965731B (zh) 基于Tinker的Flutter热更新方法、装置、设备及存储介质
CN111552480B (zh) 跨平台编译方法、装置、设备及可读存储介质
JP5129904B2 (ja) 実行時における関数の実行性能を増大させるための方法、計算機システム、実行時における関数の実行性能を増大させるための、コンピュータプログラムを格納するコンピュータ読み取り可能媒体
CN112631915A (zh) 一种pcie设备软件仿真的方法、系统、设备及介质
EP1265136A2 (en) Linking of applications into devices having overlays and shadow memories
CN112016095B (zh) 一种验证漏洞的方法、装置和电子设备
CN115167862A (zh) 补丁方法及相关设备
EP1136910A2 (en) A method of compiling code in an object oriented programming language
JP2004192604A (ja) 組込みソフトウェア開発装置及び組込みソフトウェア開発方法
CN116909656B (zh) 一种基于elf文件实现嵌入式动态APP加载的方法

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