CN108874438A - 补丁生成方法、装置、电子设备及计算机程序产品 - Google Patents
补丁生成方法、装置、电子设备及计算机程序产品 Download PDFInfo
- Publication number
- CN108874438A CN108874438A CN201810659204.4A CN201810659204A CN108874438A CN 108874438 A CN108874438 A CN 108874438A CN 201810659204 A CN201810659204 A CN 201810659204A CN 108874438 A CN108874438 A CN 108874438A
- Authority
- CN
- China
- Prior art keywords
- patch
- code file
- source code
- file
- global variable
- 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.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/60—Software deployment
- G06F8/65—Updates
- G06F8/658—Incremental updates; Differential updates
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—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
技术领域
本发明涉及计算机技术,具体地,涉及一种补丁生成方法、装置、电子设备及计算机程序产品。
背景技术
小规模的嵌入式解决方案,通常以ARM Cortex-M系列处理器为主。这一类产品,为了做到成本的极致,更加偏向以ROM作为代码的存储介质,而避免使用成本高30%左右的片上闪存。ROM版本的芯片产品在生产过程中必须烧录代码,后续使用过程中则无法继续更新;而片上闪存版本的芯片产品则可以多次擦写代码的内容。在以ROM作为代码存储器的系统方案中,由于ROM不可改写的天然特性,一旦代码中有Bug,哪怕是个很小的错误,都会给整个系统带来不可挽回的后果,甚至无法使用。为了避免因重新定制ROM所导致的巨额成本,补丁(PATCH)模块利用ARM Cortex-M系列处理器的FPB(转换及断电单元:Flash PATCHand Breakpoint)单元所提供的代码重映射功能和Thumb-2指令集中灵活多样的分支指令,实现了所谓的为ROM打补丁的功能。但目前ARM Cortex M系列CPU中由ARM公司标配的补丁通道数为6。该补丁生成机制的初衷是解决烧写在ROM中的代码中的偶发bug问题。对于功能较复杂的嵌入式处理器,由于设计周期短,芯片在流片前的测试不一定够充分,芯片进入客户的系统产品开发阶段后,往往发现6个补丁通道远不够用。
同时,目前补丁生成是完全手动完成的。传统手动补丁生成的完成流程可参见图1所示。整个补丁流程的起点是ROM镜像,经由原始C代码通过标准的工具中的编译器产生。编译器可选用ARM公司的Keil工具链中的ARMCC或者开源的GCC。ROM镜像包含嵌入式应用中的完整机器代码,和原始的汇编代码是一一对应的。ROM镜像烧录芯片之后不能再对ROM本身进行任何更改,只能使用ARM提供的FPB机制利用额外的片上SRAM更改少许代码。在具体实际应用时,发现完全以手动的方式生成补丁的过程中,每一个补丁的生成,涉及到手工编写C代码、编写补丁入口汇编头、及其修改跳转标签和全局变量ROM地址等,工作量相较于通常的C代码编程增加了很多倍。同时,手动制作补丁的过程不仅得让软件工程师维护C代码同时,还要维护汇编代码、和及其码,无形中增加诸多的时间成本。由此可见,手动生成补丁的方式在提升了芯片的可维护性和可拓展性的同时,亦带来的工作效率的低下、可移植性较差问题。
发明内容
有鉴于此,本发明实施例期望提供一种补丁生成方法、装置、电子设备及计算机程序产品。
为达到上述目的,本发明实施例的技术方案是这样实现的:
本发明实施例第一方面提供了一种补丁生成方法,所述方法包括:
接收补丁源代码文件,其中,所述补丁源代码文件是针对原始源代码文件进行修改后生成的源代码文件,所述补丁源代码文件中包含具有单一入口的一个或多个修改后的函数;
将所述补丁源代码文件进行编译生成补丁汇编代码文件;
对所述补丁汇编代码文件进行编译生成单个补丁通道的补丁目标代码文件。
本发明实施例第二方面提供了一种补丁生成装置,所述装置包括处理器,所述处理器被配置有处理器可执行的操作指令,以执行如本发明实施例第一方面所述方法中的各个步骤。
本发明实施例第三方面提供了一种电子设备,所述电子设备包括:显示器,存储器,一个或多个处理器;以及一个或多个模块,所述一个或多个模块被存储在所述存储器中,并被配置成由所述一个或多个处理器执行,所述一个或多个模块包括用于执行如本发明实施例第一方面所述方法中各个步骤的指令。
本发明实施例第四方面提供了一种计算机程序产品,所述计算机程序产品对用于执行一种过程的指令进行编码,所述过程包括本发明实施例第一方面所述的方法。
本发明的有益效果如下:本发明可自动生成补丁,弥补了传统手工生成补丁的缺陷。补丁源代码文件中可包含多个修改后的函数,由此将所有的修改集中在单一入口的一个或几个函数中,以减少补丁通道的个数。另外,本发明所提出的补丁生成方法可配合ROM版本的嵌入式芯片使用,使后者初步具备了片上闪存版本的芯片性能,以不到1%的成本增加了达到了成本在30%以上的片上闪存能起到的作用。
附图说明
此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:
图1为传统手动补丁生成流程图;
图2为本发明实施例1所述的补丁生成方法的流程图;
图3为本发明实施例1所述的多个补丁目标代码文件输入补丁通道地址计算回填工具的原理图;
图4为本发明实施例2所述的补丁生成装置的工作流程图。
具体实施方式
为了使本发明实施例中的技术方案及优点更加清楚明白,以下结合附图对本发明的示例性实施例进行进一步详细的说明,显然,所描述的实施例仅是本发明的一部分实施例,而不是所有实施例的穷举。需要说明的是,在不冲突的情况下,本发明中的实施例及实施例中的特征可以相互组合。
实施例1
如图2所示,本实施例提出了一种补丁生成方法,所述方法包括:
S101,接收补丁源代码文件。
具体地,所述补丁源代码文件是针对原始源代码文件进行修改后生成的源代码文件,所述补丁源代码文件中包含具有单一入口的一个或多个修改后的函数。
在多个修改后的函数交换信息时,可以严格要求以参数的形式做传递,禁止定义新的只用于在这几个特定的函数中传递信息的全局变量。同时,在对原始源代码编程时,若对某一项功能的实现尚不确定,可在原始源代码中预留一定的空的占位函数(StubFunction),以便在占位函数中进行函数的增加或修改,实现功能的添加或修改。
另外,在本实施例中,可将尽量多地修改集成在单一入口的一个或多个函数中,然后将具有单一入口的一个或多个函数集合在一个补丁源代码文件中,从而由于在系统打补丁时,一个补丁源代码文件会占用一个补丁通道,这样就可以减少补丁通道的个数。集成的补丁源代码文件中要调用的其他不在该文件中的函数可以以extern定义,并且尽量不使用全局变量;如果使用了全局变量,则需要执行全局变量冲突消除,具体地实施可以参见本实施例中步骤S104。
S102,将所述补丁源代码文件进行编译生成补丁汇编代码文件。
具体地,在进行编译之前,可由工程师或相关技术人员先在补丁源代码文件中指定分散加载文件,然后,获取原始源代码文件中所有的宏定义和类型定义,然后再根据所述宏定义、类型定义和指定分散加载文件将所述补丁源代码文件进行编译生成补丁汇编代码文件。具体地,对代码文件进行编译的过程可直接借助于标准的ARMCC或GCC工具来实现。
本实施例中,分散加载文件(scatter file,后缀为.scf)是一个文本文件,该分散加载文件可以用来指定ARM连接器在生成映像文件时如何分配RO,RW,ZI等数据的存放地址。在具体实施时,如果不指定分散加载文件,那么ARM连接器会按照默认的方式来生成映像文件。但在希望把某些数据放在指定的地址处时,就需要指定分散加载文件。例如,LPC2378芯片具有多个不连续的SRAM,通用的RAM是32KB,可是32KB不够用,当技术人员希望把某个.C中的RW数据放在USB的SRAM中时,那么就可以通过指定分散加载文件来完成这个功能。
在实施本实施例所述的补丁生成方法之前,与现有技术中手动补丁生成方法相似,通过标准工具中的编译器对原始源代码文件进行编译得到ROM镜像。编译器可选用ARM公司的Keil工具链中的ARMCC或者开源的GCC。ROM镜像包含嵌入式应用中的完整机器代码,和原始的汇编代码是一一对应的。
在补丁源代码文件中,某一段代码可能位于多重宏嵌套之下,并引用了宏定义所替代的内容。将这段代码移植到单独的文件中时,要对所有的宏定义所替代的内容进行展开。这个步骤需对生成原始ROM镜像所用到的宏定义的取值有清晰的了解,并能够从语法上分析多重宏定义嵌套最终对补丁源代码文件发生的影响。除了宏之外,本实施例还可以自动获取其他类型定义。
具体地,本实施例中可以采用与爬虫算法类似的方法,自动爬取原始源代码里所有的宏、类型定义。具体地,可以先对原始源代码文件进行源码注释去除,并获取对原始源代码编译后产生的MAP文件和Output Trace文件;再通过MAP文件和OutputTrac文件,按照编译顺序爬取原始源代码文件中的宏定义和类型定义;对爬取的宏定义和类型定义进行去重处理后,生成包含宏定义、类型定义等信息在内的类型定义文件,系统在对补丁源代码文件进行编译时可从该类型定义文件中获取相应的宏定义、类型定义等信息。
在本实施例所述的根据所述宏定义、类型定义和指定分散加载文件将所述补丁源代码文件进行编译生成补丁汇编代码文件之后,本实施例所述方法还包括对生成的补丁汇编文件进行汇编整理的过程。该汇编整理的过程具体可包括加入补丁头文件、添加对齐标记和/或加入跳转标签;所述补丁头文件用于指示补丁目标代码文件的入口地址和出口地址;所述对齐标记用于将补丁源代码文件中一个或多个修改后的函数的入口地址统一为单一入口;所述跳转标签用于指示修改后的函数之间的调用。
由于生成的补丁中包括一个或多个修改后的函数,因此需要进行汇编整理,以使得该一个或多个修改后的函数能够被调用。具体地,为了实现单个函数的调用,只需要在该单个函数的数据区加入对齐标记即可;对于多个函数的调用,可以先查找到入口函数调用的其他函数,然后将其他函数嵌入到入口函数体内部,再在入口函数中加入对齐标记,插入跳转标签等。此外,对于回调或者长跳转指令也会进行对应的特殊处理,例如,进行响应汇编嵌入。然后在入口函数的末尾加入返回地址标签,该返回地址标签用于指示完成补丁退出时的跳出地址。最后将入口函数整理成单一汇编函数后,进行ARMCC或GCC编译链接。
S103,对所述补丁汇编代码文件进行编译生成单个补丁通道的补丁目标代码文件。
具体地,本实施例中所述的每个补丁目标代码文件中均包含一个或多个修改后的函数,每个修改后的函数均具有入口地址和出口地址,其中,每个修改后的函数的入口地址是对齐的,即具有单一入口;出口地址可由技术人员根据本领域公知的常规查找方法从ROM镜像中的汇编文件中查找得到。
经由ARMCC或GCC编译链接后提取数据,得到单个补丁通道的补丁目标代码文件,可以为2进制或16进制文件。
进一步的,在上述过程基础上,本实施例所述方法S102之前还可以进一步包括以下步骤:
S104,判断补丁源代码文件的修改后的函数中是否存在全局变量;如果存在,则执行S105,如果不存在,则执行S102。
S105,对补丁源代码文件的全局变量进行冲突清除。
具体地,判断补丁源代码文件的修改后的函数中是否存在全局变量的过程为:查找所述补丁源代码文件当中的预设全局变量标识,当查找到所述全局变量标识时确认补丁源代码文件的修改后的函数中存在全局变量。在具体实施过程中,该预设全局变量标识可以采用正则表达式的形式表示。
当判断出补丁源代码文件的修改后的函数中不存在全局变量的话,则跳过冲突清除的过程从而直接对补丁源代码文件进行编译即可。
当存在全局变量的话,则通过以下方式对补丁源代码文件的全局变量进行冲突清除:根据预先获取的ROM镜像的大小配置编译分散加载文件;根据分散加载文件对补丁源代码文件进行编译,获得中间代码文件;从所述中间代码文件中获取所述补丁源代码文件的全局变量的实际地址;将所述补丁源代码文件的全局变量的临时地址替换为所述全局变量的实际地址。
具体地,在补丁源代码文件中,如果使用了全局变量,则在编译的代码输出的目标文件中不仅存在函数地址,而且存在全局变量地址;在开始时,输入的补丁源代码里的全局变量地址为临时地址,这个地址可能会被排在后面的补丁占用,造成补丁的全局变量被覆盖,进而产生冲突。这时可以根据预先获取的ROM镜像的大小配置编译分散加载文件;然后根据该分散加载文件对补丁源代码文件进行编译的方式,编译完成后在输出的中间代码文件中获取全局变量的实际地址,并用该地址替换掉补丁源代码中文件中的全局变量的临时地址。
本实施例中,如果补丁源代码文件是多个的时候,可以依次对每个补丁源代码文件重复执行步骤S101-S103,并生成相对应的补丁汇编代码文件,以获得分别对应于多个补丁通道的补丁目标代码文件。
在生成补丁目标代码文件后,可以将补丁目标代码文件填入存储器中,生成补丁目标代码文件的静态随机存取存储器镜像,并将所述所有补丁目标代码文件的镜像存放在存储介质中;该所有补丁目标代码文件的镜像会由嵌入式芯片启动时装载到芯片的静态随机存取存储器中。原始源代码文件和补丁目标代码文件在运行过程中配合实现原始源代码文件的升级。
具体地,如图3所示,将不同功能所对应的补丁通道的补丁目标代码文件输入补丁通道地址计算回填工具,形成所有补丁的SRAM镜像,存放在Flash等介质中。该镜像会由嵌入式芯片的Bootloader在芯片启动时装载到芯片的SRAM中。其中,补丁目标代码文件按大小排序依次填入SRAM,以达到对SRAM的面积占用最小。
本实施例的补丁通道地址计算回填工具,能够根据补丁目标代码文件的入口地址计算出CPU能够识别的机器码,然后为补丁目标代码文件分配空闲的RAM区域,方便在Bootloader在加载时直接加载到分配好的SRAM区域中。具体地,当补丁目标代码文件有多个时,该补丁通道地址计算回填工具需要根据当前补丁目标代码文件在该多个补丁目标代码文件中的序号和其入口地址计算出CPU能够识别的机器码,然后为补丁目标代码文件分配空闲的RAM区域,方便在Bootloader在加载时直接加载到分配好的SRAM区域中。
本实施例所述方法在实际使用过程中可以存在至少以下三种工作形式。第一种,对某一功能下的多个函数进行合并后,通过单个补丁通道传输到ROM版本的嵌入式芯片系统内核中来打补丁;第二种,对不同功能下、所调用的同一函数的源函数进行修改后,通过单个补丁通道传输到ROM版本的嵌入式芯片系统内核中打补丁。第三种,在特定场景下,例如,对于某一功能下的多个函数,分别生成多个补丁,然后通过多个补丁通道传输到ROM版本的嵌入式芯片系统内核中打补丁。
本实施例所述方法配合ROM版本的嵌入式芯片使用,使后者初步具备了片上闪存版本的芯片性能,以不到1%的成本增加了达到了成本在30%以上的片上闪存能起到的作用。
补丁自动化生成着重是替换掉原来ROM中的指令,而改用放在SRAM中的指令的过程。尽管新增的C代码对应的汇编代码可以很容易地通过编译器产生,但沿用的C代码对应到的汇编代码则需要和过去保持严格一致。这就要求新增的汇编代码和沿用的汇编代码对寄存器的使用不能有冲突。一旦新旧代码中的寄存器使用引入未经许可的依赖性,整个汇编的执行会立刻出错。这种限制,使得简单地由编译器去编译新增的C代码的复杂性极大的增加了,因为编译器对要使用到的寄存器的选择是完全自主的,不会去接受程序员的指定。而本发明中将补丁生成流程实现了核心环节的自动化,避免手动打补丁过程中的低效劳动,使能软件工程师对于打补丁的生产效率得到成倍提升。
同时,本实施例中将所有补丁都作为函数补丁对待,即使在某个函数中只修改了几句甚至是一句C的源码,补丁的范围(即新增的汇编代码的范围)都将扩大到整个函数。利用ARMCC和GCC的寄存器分配不进行跨函数优化的实现特性,规避新增的汇编代码和沿用的汇编代码中的寄存器冲突。这种以完整函数的形式实现补丁自动化,通过可接受的汇编代码量增加换取了自动打补丁的流程与现有ARMCC、GCC的工具框架完全融合,不需要对原有的工具做额外的改动。本发明的设计思路不仅适用于ARM Cortex M系列的处理器,对于任何用ROM作为代码存储的嵌入式处理器原则上都适用。
实施例2
本实施例提出了一种补丁生成装置,所述装置包括处理器,所述处理器被配置有处理器可执行的操作指令,以执行如实施例1所述方法中的各个步骤。其中具体地工作原理如图4所示,本实施例所述的补丁生成装置中处理器包括:
补丁汇编代码文件生成模块,用于接收补丁源代码文件,将所述补丁源代码文件进行编译生成补丁汇编代码文件;
编译器,用于对所述补丁汇编代码文件进行编译生成单个补丁通道的补丁目标代码文件。本实施例中,编译器可选用ARM公司的Keil工具链中的ARMCC或者开源的GCC。
具体地,所述补丁源代码文件是针对原始源代码文件进行修改后生成的源代码文件,所述补丁源代码文件中包含具有单一入口的一个或多个修改后的函数。
在多个修改后的函数交换信息时,可以严格要求以参数的形式做传递,禁止定义新的只用于在这几个特定的函数中传递信息的全局变量。同时,在对原始源代码编程时,若对某一项功能的实现尚不确定,可在原始源代码中预留一定的空的占位函数(StubFunction),以便在占位函数中进行函数的增加或修改,实现功能的添加或修改。
另外,在本实施例中,可将尽量多地修改集成在单一入口的一个或多个函数中,然后将具有单一入口的一个或多个函数集合在一个补丁源代码文件中,从而由于在系统打补丁时,一个补丁源代码文件会占用一个补丁通道,这样就可以减少补丁通道的个数。集成的补丁源代码文件中要调用的其他不在该文件中的函数可以以extern定义,并且尽量不使用全局变量;如果使用了全局变量,则需要执行全局变量冲突消除,具体地实施可以参见本实施例中全局变量冲突消除模块的内容。
本实施例在对补丁源代码文件进行编译之前,可由工程师或相关技术人员先在补丁源代码文件中指定分散加载文件,然后,获取原始源代码文件中所有的宏定义和类型定义,然后再根据所述宏定义、类型定义和指定分散加载文件将所述补丁源代码文件进行编译生成补丁汇编代码文件。具体地,对代码文件进行编译的过程可直接借助于标准的ARMCC或GCC工具来实现。
本实施例中,分散加载文件(scatter file,后缀为.scf)是一个文本文件,该分散加载文件可以用来指定ARM连接器在生成映像文件时如何分配RO,RW,ZI等数据的存放地址。在具体实施时,如果不指定分散加载文件,那么ARM连接器会按照默认的方式来生成映像文件。但在希望把某些数据放在指定的地址处时,就需要指定分散加载文件。例如,LPC2378芯片具有多个不连续的SRAM,通用的RAM是32KB,可是32KB不够用,当技术人员希望把某个.C中的RW数据放在USB的SRAM中时,那么就可以通过指定分散加载文件来完成这个功能。
在实施本实施例所述的补丁生成方法之前,与现有技术中手动补丁生成方法相似,通过标准工具中的编译器对原始源代码文件进行编译得到ROM镜像。编译器可选用ARM公司的Keil工具链中的ARMCC或者开源的GCC。ROM镜像包含嵌入式应用中的完整机器代码,和原始的汇编代码是一一对应的。
在补丁源代码文件中,某一段代码可能位于多重宏嵌套之下,并引用了宏定义所替代的内容。将这段代码移植到单独的文件中时,要对所有的宏定义所替代的内容进行展开。这个步骤较为复杂,需对生成原始ROM镜像所用到的宏定义的取值有清晰的了解,并能够从语法上分析多重宏定义嵌套最终对补丁源代码文件发生的影响。除了宏之外,还可以获取其他类型定义,
具体地,本实施例中可以采用与爬虫算法类似的方法,自动爬取原始源代码里所有的宏、类型定义。具体地,可以先对原始源代码文件进行源码注释去除,并获取对原始源代码编译后产生的MAP文件和Output Trace文件;再通过MAP文件和OutputTrac文件,按照编译顺序爬取原始源代码文件中的宏定义和类型定义;对爬取的宏定义和类型定义进行去重处理后,生成包含宏定义、类型定义等信息在内的类型定义文件,系统在对补丁源代码文件进行编译时可从该类型定义文件中获取相应的宏定义、类型定义等信息。
在本实施例所述的根据所述宏定义、类型定义和指定分散加载文件将所述补丁源代码文件进行编译生成补丁汇编代码文件之后,本实施例所述方法还包括对生成的补丁汇编文件进行汇编整理的过程,该汇编整理的过程具体可包括加入补丁头文件、添加对齐标记和/或加入跳转标签;所述补丁头文件用于指示补丁目标代码文件的入口地址和出口地址;所述对齐标记用于将补丁源代码文件中一个或多个修改后的函数的入口地址统一为单一入口;所述跳转标签用于指示修改后的函数之间的调用。
本实施例中所述的每个补丁目标代码文件中均包含一个或多个修改后的函数,每个修改后的函数均具有入口地址和出口地址,其中,每个修改后的函数的入口地址是对齐的,即具有单一入口;出口地址可由技术人员根据本领域公知的常规查找方法从ROM镜像中的汇编文件中查找得到。
经由ARMCC或GCC编译链接后提取数据,得到单个补丁通道的补丁目标代码文件,可以为2进制或16进制文件。
本实施例所述的补丁生成装置的处理器还包括全局变量冲突消除模块,用于判断补丁源代码文件的修改后的函数中是否存在全局变量,如果存在,则对补丁源代码文件的全局变量进行冲突清除。
具体地,判断补丁源代码文件的修改后的函数中是否存在全局变量的过程为:查找所述补丁源代码文件当中的预设全局变量标识,当查找到所述全局变量标识时确认补丁源代码文件的修改后的函数中存在全局变量。在具体实施过程中,该预设全局变量标识可以采用正则表达式的形式表示。
当判断出补丁源代码文件的修改后的函数中不存在全局变量的话,则跳过冲突清除的过程从而直接对补丁源代码文件进行编译即可。
当存在全局变量的话,则通过以下方式对补丁源代码文件的全局变量进行冲突清除:根据预先获取的ROM镜像的大小配置编译分散加载文件;根据分散加载文件对补丁源代码文件进行编译,获得中间代码文件;从所述中间代码文件中获取所述补丁源代码文件的全局变量的实际地址;将所述补丁源代码文件的全局变量的临时地址替换为所述全局变量的实际地址。
具体地,在补丁源代码文件中,如果使用了全局变量,则在编译的代码输出的目标文件中不仅存在函数地址,而且存在全局变量地址;在开始时,输入的补丁源代码里的全局变量地址为临时地址,这个地址可能会被排在后面的补丁占用,造成补丁的全局变量被覆盖,进而产生冲突。这时可以根据预先获取的ROM镜像的大小配置编译分散加载文件;然后根据该分散加载文件对补丁源代码文件进行编译的方式,编译完成后在输出的中间代码文件中获取全局变量的实际地址,并用该地址替换掉补丁源代码中文件中的全局变量的临时地址。
本实施例中,如果补丁源代码文件是多个的时候,可以依次对每个补丁源代码文件重复执行补丁汇编代码文件生成模块、全局变量冲突消除模块、定义类型解析模块和编译器的工作过程,以获得分别对应于多个补丁通道的补丁目标代码文件。
在生成补丁目标代码文件后,可以将补丁目标代码文件填入存储器中,生成补丁目标代码文件的静态随机存取存储器镜像,并将所述所有补丁目标代码文件的镜像存放在存储介质中;该所有补丁目标代码文件的镜像会由嵌入式芯片启动时装载到芯片的静态随机存取存储器中。原始源代码文件和补丁目标代码文件在运行过程中配合实现原始源代码文件的升级。
具体地,如图3所示,将不同功能所对应的补丁通道的补丁目标代码文件输入补丁通道地址计算回填工具,形成所有补丁的SRAM镜像,存放在Flash等介质中。该镜像会由嵌入式芯片的Bootloader在芯片启动时装载到芯片的SRAM中。其中,补丁目标代码文件按大小排序依次填入SRAM,以达到对SRAM的面积占用最小。
本实施例的补丁通道地址计算回填工具,能够根据补丁目标代码文件的入口地址计算出CPU能够识别的机器码,然后为补丁目标代码文件分配空闲的RAM区域,方便在Bootloader在加载时直接加载到分配好的SRAM区域中。具体地,当补丁目标代码文件有多个时,该补丁通道地址计算回填工具需要根据当前补丁目标代码文件在该多个补丁目标代码文件中的序号和其入口地址计算出CPU能够识别的机器码,然后为补丁目标代码文件分配空闲的RAM区域,方便在Bootloader在加载时直接加载到分配好的SRAM区域中。
本实施例所述方法在实际使用过程中可以存在至少以下三种工作形式。第一种,对某一功能下的多个函数进行合并后,通过单个补丁通道传输到ROM版本的嵌入式芯片系统内核中来打补丁;第二种,对不同功能下、所调用的同一函数的源函数进行修改后,通过单个补丁通道传输到ROM版本的嵌入式芯片系统内核中打补丁。第三种,在特定场景下,例如,对于某一功能下的多个函数,分别生成多个补丁,然后通过多个补丁通道传输到ROM版本的嵌入式芯片系统内核中打补丁。
本实施例所述补丁生成装置配合ROM版本的嵌入式芯片使用,使后者初步具备了片上闪存版本的芯片性能,以不到1%的成本增加了达到了成本在30%以上的片上闪存能起到的作用。
补丁自动化生成着重是替换掉原来ROM中的指令,而改用放在SRAM中的指令的过程。尽管新增的C代码对应的汇编代码可以很容易地通过编译器产生,但沿用的C代码对应到的汇编代码则需要和过去保持严格一致。这就要求新增的汇编代码和沿用的汇编代码对寄存器的使用不能有冲突。一旦新旧代码中的寄存器使用引入未经许可的依赖性,整个汇编的执行会立刻出错。这种限制,使得简单地由编译器去编译新增的C代码的复杂性极大的增加了,因为编译器对要使用到的寄存器的选择是完全自主的,不会去接受程序员的指定。而本发明中将补丁生成流程实现了核心环节的自动化,避免手动打补丁过程中的低效劳动,使能软件工程师对于打补丁的生产效率得到成倍提升。
同时,本实施例中将所有补丁都作为函数补丁对待,即使在某个函数中只修改了几句甚至是一句C的源码,补丁的范围(即新增的汇编代码的范围)都将扩大到整个函数。利用ARMCC和GCC的寄存器分配不进行跨函数优化的实现特性,规避新增的汇编代码和沿用的汇编代码中的寄存器冲突。这种以完整函数的形式实现补丁自动化,通过可接受的汇编代码量增加换取了自动打补丁的流程与现有ARMCC、GCC的工具框架完全融合,不需要对原有的工具做额外的改动。本发明的设计思路不仅适用于ARM Cortex M系列的处理器,对于任何用ROM作为代码存储的嵌入式处理器原则上都适用。
实施例3
本实施例提供了一种电子设备,所述电子设备包括:显示器,存储器,一个或多个处理器;以及一个或多个模块,所述一个或多个模块被存储在所述存储器中,并被配置成由所述一个或多个处理器执行,所述一个或多个模块包括用于执行如实施例1所述方法中各个步骤的指令。
本实施例电子设备可自动生成补丁,弥补了传统手工生成补丁的缺陷。补丁源代码文件中包含多个修改后的函数,由此将所有的修改集中在单一入口的一个或几个函数中,以减少补丁通道的个数。另外,本发明所提出的补丁生成方法可配合ROM版本的嵌入式芯片使用,使后者初步具备了片上闪存版本的芯片性能,以不到1%的成本增加了达到了成本在30%以上的片上闪存能起到的作用。
实施例4
本实施例提供了一种计算机程序产品,所述计算机程序产品对用于执行一种过程的指令进行编码,所述过程包括实施例1所述的方法。
本实施例计算机程序产品可自动生成补丁,弥补了传统手工生成补丁的缺陷。补丁源代码文件中包含多个修改后的函数,由此将所有的修改集中在单一入口的一个或几个函数中,以减少补丁通道的个数。另外,本发明所提出的补丁生成方法可配合ROM版本的嵌入式芯片使用,使后者初步具备了片上闪存版本的芯片性能,以不到1%的成本增加了达到了成本在30%以上的片上闪存能起到的作用。
本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本申请的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请范围的所有变更和修改。
显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。
Claims (10)
1.一种补丁生成方法,其特征在于,所述方法包括:
接收补丁源代码文件,其中,所述补丁源代码文件是针对原始源代码文件进行修改后生成的源代码文件,所述补丁源代码文件中包含具有单一入口的一个或多个修改后的函数;
将所述补丁源代码文件进行编译生成补丁汇编代码文件;
对所述补丁汇编代码文件进行编译生成单个补丁通道的补丁目标代码文件。
2.根据权利要求1所述的方法,其特征在于,将所述补丁源代码文件进行编译生成补丁汇编代码文件的过程包括:
获取原始源代码文件中所有的宏定义和类型定义;
根据所述宏定义、类型定义和指定分散加载文件将所述补丁源代码文件进行编译生成补丁汇编代码文件。
3.根据权利要求2所述的方法,其特征在于,将所述补丁源代码文件进行编译生成补丁汇编代码文件之前,所述方法还包括:
爬取原始源代码文件中宏定义和类型定义,对爬取的宏定义和类型定义进行去重处理后,生成类型定义文件;
所述获取原始源代码文件中所有的宏定义和类型定义的过程包括:
从所述类型定义文件中获取原始源代码文件中所有的宏定义和类型定义。
4.根据权利要求2所述的方法,其特征在于,在根据所述宏定义、类型定义和指定分散加载文件将所述补丁源代码文件进行编译生成补丁汇编代码文件之后,所述方法还包括对生成的补丁汇编代码文件进行汇编整理,所述汇编整理包括加入补丁头文件、添加对齐标记和/或加入跳转标签;所述补丁头文件用于指示补丁目标代码文件的入口地址和出口地址;所述对齐标记用于将补丁源代码文件中一个或多个修改后的函数的入口地址统一为单一入口;所述跳转标签用于指示修改后的函数之间的调用。
5.根据权利要求1所述的方法,其特征在于,在将所述补丁源代码文件进行编译生成补丁汇编代码文件之前,所述方法还包括:判断补丁源代码文件的修改后的函数中是否存在全局变量,如果存在,则对补丁源代码文件的全局变量进行冲突清除。
6.根据权利要求5所述的方法,其特征在于,判断补丁源代码文件的修改后的函数中是否存在全局变量的过程包括:查找所述补丁源代码文件当中的预设全局变量标识,当查找到所述全局变量标识时确认补丁源代码文件的修改后的函数中存在全局变量。
7.根据权利要求5所述的方法,其特征在于,所述对补丁源代码文件的全局变量进行冲突清除包括:
根据预先获取的ROM镜像的大小配置编译分散加载文件;
根据分散加载文件对补丁源代码文件进行编译,获得中间代码文件;
从所述中间代码文件中获取所述补丁源代码文件的全局变量的实际地址;
将所述补丁源代码文件的全局变量的临时地址替换为所述全局变量的实际地址。
8.一种补丁生成装置,其特征在于,所述装置包括处理器,所述处理器被配置有处理器可执行的操作指令,以执行如权利要求1至7任一项所述方法中的各个步骤。
9.一种电子设备,其特征在于,所述电子设备包括:显示器,存储器,一个或多个处理器;以及一个或多个模块,所述一个或多个模块被存储在所述存储器中,并被配置成由所述一个或多个处理器执行,所述一个或多个模块包括用于执行权利要求1至7中任一项所述方法中各个步骤的指令。
10.一种计算机程序产品,所述计算机程序产品对用于执行一种过程的指令进行编码,所述过程包括根据权利要求1至7中任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810659204.4A CN108874438B (zh) | 2018-06-25 | 2018-06-25 | 补丁生成方法、装置、电子设备及计算机存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810659204.4A CN108874438B (zh) | 2018-06-25 | 2018-06-25 | 补丁生成方法、装置、电子设备及计算机存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108874438A true CN108874438A (zh) | 2018-11-23 |
CN108874438B CN108874438B (zh) | 2021-09-21 |
Family
ID=64294642
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810659204.4A Active CN108874438B (zh) | 2018-06-25 | 2018-06-25 | 补丁生成方法、装置、电子设备及计算机存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108874438B (zh) |
Cited By (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110502276A (zh) * | 2019-08-21 | 2019-11-26 | 深圳市钱海网络技术有限公司 | 补丁包生成方法、装置、设备及计算机可读存储介质 |
CN111142877A (zh) * | 2019-12-19 | 2020-05-12 | 无锡中感微电子股份有限公司 | Rom芯片补丁的接口函数及参数类型自动化提取方法、系统及存储介质 |
CN111562929A (zh) * | 2020-04-29 | 2020-08-21 | 米哈游科技(上海)有限公司 | 补丁文件的生成方法、装置、设备及存储介质 |
CN111930413A (zh) * | 2020-05-22 | 2020-11-13 | 无锡中感微电子股份有限公司 | 一种补丁自动生成方法、装置及系统 |
CN112698832A (zh) * | 2020-12-28 | 2021-04-23 | 东软集团股份有限公司 | 一种识别代码变更影响范围的方法、装置及设备 |
CN113296748A (zh) * | 2020-02-21 | 2021-08-24 | 上海莉莉丝科技股份有限公司 | 数据对象与数据库的映射方法、系统、服务器及计算机可读存储介质 |
CN113342555A (zh) * | 2020-02-18 | 2021-09-03 | 炬芯科技股份有限公司 | 一种修复rom的方法、装置以及存储介质 |
CN113641389A (zh) * | 2021-08-31 | 2021-11-12 | 广东九联科技股份有限公司 | 基于OpenCPU的软件升级方法、装置及设备 |
CN114579168A (zh) * | 2022-05-05 | 2022-06-03 | 苏州浪潮智能科技有限公司 | 代码更新方法、装置、电子设备和计算机可读存储介质 |
CN116992438A (zh) * | 2023-09-25 | 2023-11-03 | 北京安普诺信息技术有限公司 | 基于代码疫苗的实时漏洞修复的方法、装置、设备及介质 |
WO2024088151A1 (zh) * | 2022-10-25 | 2024-05-02 | 华为技术有限公司 | 一种获得补丁包的方法及通信装置 |
Citations (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US4028679A (en) * | 1975-10-16 | 1977-06-07 | Bell Telephone Laboratories, Incorporated | Memory patching circuit with increased capability |
WO1998054639A1 (en) * | 1997-05-29 | 1998-12-03 | Cirrus Logic, Inc. | Patching apparatus and method for upgrading modem software code |
WO2003009136A1 (en) * | 2001-07-16 | 2003-01-30 | Yuqing Ren | Embedded software update system |
CN1567232A (zh) * | 2003-07-10 | 2005-01-19 | 华为技术有限公司 | 嵌入式系统的测试装置及测试方法 |
CN102156661A (zh) * | 2010-02-11 | 2011-08-17 | 华为技术有限公司 | 在线补丁的激活方法、装置及系统 |
CN103218262A (zh) * | 2010-02-11 | 2013-07-24 | 华为技术有限公司 | 在线补丁的激活方法、装置及系统 |
CN103218241A (zh) * | 2013-04-19 | 2013-07-24 | 华为技术有限公司 | 补丁加载方法和装置 |
CN103744709A (zh) * | 2014-01-23 | 2014-04-23 | 华为技术有限公司 | 补丁加载方法及装置 |
CN105159738A (zh) * | 2015-08-20 | 2015-12-16 | 上海斐讯数据通信技术有限公司 | 一种热补丁实现方法及系统 |
US20160019054A1 (en) * | 2014-07-21 | 2016-01-21 | Sandisk Technologies Inc. | Method and System for Generating a ROM Patch |
CN105446712A (zh) * | 2014-08-08 | 2016-03-30 | 阿里巴巴集团控股有限公司 | 一种应用程序缺陷修补方法及装置 |
CN105607937A (zh) * | 2015-12-25 | 2016-05-25 | 京信通信技术(广州)有限公司 | 一种热补丁方法及设备 |
CN105630557A (zh) * | 2015-12-24 | 2016-06-01 | 迈普通信技术股份有限公司 | 热补丁方法和装置 |
US9626179B2 (en) * | 2014-07-21 | 2017-04-18 | Sandisk Technologies Llc | Method and system for using a ROM patch |
CN107357622A (zh) * | 2017-07-17 | 2017-11-17 | 迈普通信技术股份有限公司 | 热补丁实现方法及通信设备 |
-
2018
- 2018-06-25 CN CN201810659204.4A patent/CN108874438B/zh active Active
Patent Citations (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US4028679A (en) * | 1975-10-16 | 1977-06-07 | Bell Telephone Laboratories, Incorporated | Memory patching circuit with increased capability |
WO1998054639A1 (en) * | 1997-05-29 | 1998-12-03 | Cirrus Logic, Inc. | Patching apparatus and method for upgrading modem software code |
WO2003009136A1 (en) * | 2001-07-16 | 2003-01-30 | Yuqing Ren | Embedded software update system |
CN1567232A (zh) * | 2003-07-10 | 2005-01-19 | 华为技术有限公司 | 嵌入式系统的测试装置及测试方法 |
CN102156661A (zh) * | 2010-02-11 | 2011-08-17 | 华为技术有限公司 | 在线补丁的激活方法、装置及系统 |
CN103218262A (zh) * | 2010-02-11 | 2013-07-24 | 华为技术有限公司 | 在线补丁的激活方法、装置及系统 |
CN103218241A (zh) * | 2013-04-19 | 2013-07-24 | 华为技术有限公司 | 补丁加载方法和装置 |
CN103744709A (zh) * | 2014-01-23 | 2014-04-23 | 华为技术有限公司 | 补丁加载方法及装置 |
US20160019054A1 (en) * | 2014-07-21 | 2016-01-21 | Sandisk Technologies Inc. | Method and System for Generating a ROM Patch |
US9626179B2 (en) * | 2014-07-21 | 2017-04-18 | Sandisk Technologies Llc | Method and system for using a ROM patch |
CN105446712A (zh) * | 2014-08-08 | 2016-03-30 | 阿里巴巴集团控股有限公司 | 一种应用程序缺陷修补方法及装置 |
CN105159738A (zh) * | 2015-08-20 | 2015-12-16 | 上海斐讯数据通信技术有限公司 | 一种热补丁实现方法及系统 |
CN105630557A (zh) * | 2015-12-24 | 2016-06-01 | 迈普通信技术股份有限公司 | 热补丁方法和装置 |
CN105607937A (zh) * | 2015-12-25 | 2016-05-25 | 京信通信技术(广州)有限公司 | 一种热补丁方法及设备 |
CN107357622A (zh) * | 2017-07-17 | 2017-11-17 | 迈普通信技术股份有限公司 | 热补丁实现方法及通信设备 |
Cited By (16)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110502276A (zh) * | 2019-08-21 | 2019-11-26 | 深圳市钱海网络技术有限公司 | 补丁包生成方法、装置、设备及计算机可读存储介质 |
CN111142877A (zh) * | 2019-12-19 | 2020-05-12 | 无锡中感微电子股份有限公司 | Rom芯片补丁的接口函数及参数类型自动化提取方法、系统及存储介质 |
CN111142877B (zh) * | 2019-12-19 | 2023-10-27 | 无锡中感微电子股份有限公司 | Rom芯片补丁的接口函数及参数类型自动化提取方法、系统及存储介质 |
CN113342555A (zh) * | 2020-02-18 | 2021-09-03 | 炬芯科技股份有限公司 | 一种修复rom的方法、装置以及存储介质 |
CN113342555B (zh) * | 2020-02-18 | 2024-01-09 | 炬芯科技股份有限公司 | 一种修复rom的方法、装置以及存储介质 |
CN113296748A (zh) * | 2020-02-21 | 2021-08-24 | 上海莉莉丝科技股份有限公司 | 数据对象与数据库的映射方法、系统、服务器及计算机可读存储介质 |
CN111562929A (zh) * | 2020-04-29 | 2020-08-21 | 米哈游科技(上海)有限公司 | 补丁文件的生成方法、装置、设备及存储介质 |
CN111930413B (zh) * | 2020-05-22 | 2023-07-21 | 无锡中感微电子股份有限公司 | 一种补丁自动生成方法、装置及系统 |
CN111930413A (zh) * | 2020-05-22 | 2020-11-13 | 无锡中感微电子股份有限公司 | 一种补丁自动生成方法、装置及系统 |
CN112698832A (zh) * | 2020-12-28 | 2021-04-23 | 东软集团股份有限公司 | 一种识别代码变更影响范围的方法、装置及设备 |
CN112698832B (zh) * | 2020-12-28 | 2024-02-13 | 东软集团股份有限公司 | 一种识别代码变更影响范围的方法、装置及设备 |
CN113641389A (zh) * | 2021-08-31 | 2021-11-12 | 广东九联科技股份有限公司 | 基于OpenCPU的软件升级方法、装置及设备 |
CN113641389B (zh) * | 2021-08-31 | 2024-02-09 | 广东九联科技股份有限公司 | 基于OpenCPU的软件升级方法、装置及设备 |
CN114579168A (zh) * | 2022-05-05 | 2022-06-03 | 苏州浪潮智能科技有限公司 | 代码更新方法、装置、电子设备和计算机可读存储介质 |
WO2024088151A1 (zh) * | 2022-10-25 | 2024-05-02 | 华为技术有限公司 | 一种获得补丁包的方法及通信装置 |
CN116992438A (zh) * | 2023-09-25 | 2023-11-03 | 北京安普诺信息技术有限公司 | 基于代码疫苗的实时漏洞修复的方法、装置、设备及介质 |
Also Published As
Publication number | Publication date |
---|---|
CN108874438B (zh) | 2021-09-21 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108874438A (zh) | 补丁生成方法、装置、电子设备及计算机程序产品 | |
Anand et al. | CertiCoq: A verified compiler for Coq | |
US9864590B2 (en) | Method and system for automated improvement of parallelism in program compilation | |
CN100462920C (zh) | 为优化的程序生成展开信息 | |
CN100465895C (zh) | 编译器、编译方法 | |
CN103927187B (zh) | 嵌入式系统程序执行方法 | |
CN111796831B (zh) | 一种多芯片兼容的编译方法和装置 | |
CN104156314A (zh) | 一种应用于测试系统的代码重用方法 | |
US20080104096A1 (en) | Software development system | |
US9619212B2 (en) | Providing code, code generator and software development environment | |
CN111770116B (zh) | 一种执行智能合约的方法、区块链节点、存储介质 | |
CN111770205B (zh) | 一种执行智能合约的方法、区块链节点、系统和存储介质 | |
CN105531672A (zh) | 解析器生成 | |
JP2007531946A (ja) | データ処理装置におけるデータ整合性 | |
CN110442371A (zh) | 一种发布代码的方法、装置、介质及计算机设备 | |
CN111768184A (zh) | 一种执行智能合约的方法及区块链节点 | |
CN104750533B (zh) | C程序编译方法及编译器 | |
US20110231830A1 (en) | Loop Transformation for Computer Compiler Optimization | |
CN111768183A (zh) | 一种执行智能合约的方法、区块链节点和存储介质 | |
CN113220326B (zh) | 智能合约升级方法及区块链系统 | |
Ciccozzi et al. | Towards translational execution of action language for foundational uml | |
CN100559344C (zh) | 一种支持用规则记录变量访问专用寄存器组的处理方法 | |
TW201218008A (en) | Intelligent architecture creator | |
CN108304184A (zh) | 编译方法及装置 | |
CN113220327B (zh) | 智能合约升级方法及区块链系统 |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |