CN101882094A - 嵌入式系统制作补丁的方法和系统 - Google Patents
嵌入式系统制作补丁的方法和系统 Download PDFInfo
- Publication number
- CN101882094A CN101882094A CN2010101994069A CN201010199406A CN101882094A CN 101882094 A CN101882094 A CN 101882094A CN 2010101994069 A CN2010101994069 A CN 2010101994069A CN 201010199406 A CN201010199406 A CN 201010199406A CN 101882094 A CN101882094 A CN 101882094A
- Authority
- CN
- China
- Prior art keywords
- patch
- reserved area
- file
- address
- function
- 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
Links
Images
Landscapes
- Stored Programmes (AREA)
Abstract
本发明公开了一种嵌入式系统制作补丁的方法和系统,属于网络通讯领域。该方法包括:在系统镜像文件设置用于存储补丁函数的补丁预留区域;获取并存储符号文件;获取补丁文件,并根据符号文件对补丁文件进行符号解析、地址重定位,得到补丁函数在所述补丁预留区域的地址;根据补丁函数在所述补丁预留区域的地址将所述补丁函数存储到所述补丁预留区域,并修改被补丁函数的地址为所述补丁函数在所述补丁预留区域的地址。该系统包括:设置模块、获取和存储模块、获取模块和修补模块。本发明的技术方案可以使得设备重新上电的时候补丁仍然有效,简化了用户操作,降低了系统成本。
Description
技术领域
本发明涉及网络通讯领域,尤其涉及一种网络通讯设备嵌入式系统制作补丁的方法和系统。
背景技术
通常网络通讯设备需要高可靠性、高稳定性。但是软件不可避免存在的各种错误会给通讯设备带来不稳定性,这种矛盾决定通讯设备需要不断升级系统软件。系统软件升级的必然结果是造成用户通信中断,从而给用户带来不可预料的后果。因此业界提出热补丁的概念,目的在于既能修复软件的错误又不需要升级系统软件保持通信正常。
目前业界补丁制作的方法一般是对内存里被补丁函数的入口处增加跳转到补丁函数的指令,从而在被补丁函数被调用时直接跳转到补丁函数,以达到补丁的目的。因为是直接修改内存,所以设备重新上电之后系统软件重新加载之后补丁失效。要想使得补丁再次有效,只能重新打补丁,操作起来不方便。
发明内容
本发明的目的在于提供一种嵌入式系统制作补丁的方法和系统,使得设备重新上电的时候补丁仍然有效。本发明的技术方案如下:
一种嵌入式系统制作补丁的方法,包括:
在系统镜像文件设置用于存储补丁函数的补丁预留区域;
获取并存储符号文件;
获取补丁文件,并根据符号文件对补丁文件进行符号解析、地址重定位,得到补丁函数在所述补丁预留区域的地址;
根据补丁函数在所述补丁预留区域的地址将所述补丁函数存储到所述补丁预留区域,并修改被补丁函数的地址为所述补丁函数在所述补丁预留区域的地址。
进一步地,由补丁预留区域的头部信息对补丁预留区域进行限定,补丁预留区域的头部信息包括:补丁预留区域的标识、补丁预留区域可用大小、补丁预留区域已用大小、已经打上补丁的个数和补丁节区的个数。
进一步地,根据符号文件对补丁文件进行符号解析包括:
判断补丁预留区域是否有补丁预留区域的标识,如果是,则获取补丁预留区域的剩余大小;
获取补丁文件的符号,确定补丁文件的符号是否在所述符号文件中存在,如果存在,则确定补丁文件的大小,如果补丁文件的大小未超过补丁预留区域的剩余大小,则在补丁预留区域建立一个新的补丁区域,用于存放本次补丁所有的代码跟数据,以及确定存放补丁文件的补丁节区的头信息,所述头信息包括:所在节的类型、距离补丁预留区域头部的偏移地址、被补丁函数的地址、补丁函数在补丁预留区域的地址、本节的大小和本节的对齐方式;
根据补丁预留区域的初始值确定补丁函数在补丁预留区域的地址为被补丁函数所在地址与距离补丁预留区域头部的偏移地址的和值。
进一步地,根据符号文件对补丁文件进行地址重定位包括:
读取补丁文件的代码重定位节,找到所有需要重定位的外部符号,根据外部符号的符号名查找符号文件里符号表项,若找到,则用被补丁函数所在地址填充需重定位的符号地址;若没找到,则报错退出;如果需要重定位的是补丁文件定义的函数,则补丁函数地址重新赋值为:符号地址与新建立的补丁函数在补丁预留区域的地址的和值,并保存补丁函数名称和补丁函数在补丁预留区域的地址。
进一步地,所述系统镜像文件为可执行和链接格式。
一种嵌入式系统制作补丁的系统,包括:
设置模块,用于在系统镜像文件设置用于存储补丁函数的补丁预留区域。
获取和存储模块,用于获取并存储符号文件;
获取模块,用于获取补丁文件,并根据符号文件对补丁文件进行符号解析、地址重定位,得到补丁函数在所述补丁预留区域的地址;
修补模块,用于根据补丁函数在所述补丁预留区域的地址将所述补丁函数存储到所述补丁预留区域,并修改所述被补丁函数的地址为所述补丁函数在所述补丁预留区域的地址。
进一步地,设置模块,具体用于对补丁预留区域的头部信息对补丁预留区域进行限定,其中,补丁预留区域的头部信息包括:补丁预留区域的标识、补丁预留区域可用大小、补丁预留区域已用大小、已经打上补丁的个数和补丁节区的个数。
进一步地,所述获取模块,用于根据符号文件对补丁文件进行符号解析包括:
所述获取模块,用于判断补丁预留区域是否有补丁预留区域的标识,如果是,则获取补丁预留区域的剩余大小;
获取补丁文件的符号,确定补丁文件的符号是否在所述符号文件中存在,如果存在,则确定补丁文件的大小,如果补丁文件的大小未超过补丁预留区域的剩余大小,则在补丁预留区域建立一个新的补丁区域,用于存放本次补丁所有的代码跟数据,以及确定存放补丁文件的补丁节区的头信息,所述头信息包括:所在节的类型、距离补丁预留区域头部的偏移地址、被补丁函数的地址、补丁函数在补丁预留区域的地址、本节的大小和本节的对齐方式;
根据补丁预留区域的初始值确定补丁函数在补丁预留区域的地址为被补丁函数所在地址与距离补丁预留区域头部的偏移地址的和值。
进一步地,所述获取模块,用于根据符号文件对补丁文件进行地址重地位包括:
所述获取模块,具体用于读取补丁文件的代码重定位节,找到所有需要重定位的外部符号,根据外部符号的符号名查找符号文件里符号表项,若找到,则用被补丁函数所在地址填充需重定位的符号地址;若没找到,则报错退出;如果需要重定位的是补丁文件定义的函数,则补丁函数地址重新赋值为:符号地址与新建立的补丁函数在补丁预留区域的地址的和值,并保存补丁函数名称和补丁函数在补丁预留区域的地址。
进一步地,还包括:写入更新模块,用于将新建立的存放补丁文件的补丁节区的头信息写入系统镜像文件,并更新补丁预留区域的头部信息。
在本发明实施例中,通过在系统镜像文件设置用于存储补丁函数的补丁预留区域;获取并存储符号文件,所述符号文件包括被补丁函数的地址;获取补丁文件,并根据符号文件对补丁文件进行符号解析、地址重定位,得到补丁函数在所述补丁预留区域的地址;根据补丁函数在所述补丁预留区域的地址将所述补丁函数存储到所述补丁预留区域,并修改所述被补丁函数的地址为所述补丁函数在所述补丁预留区域的地址,使其能跳转到所述补丁函数;其中,系统镜像文件为可执行和链接格式,可以使得设备重新上电的时候补丁仍然有效,简化了用户操作,降低了系统成本
附图说明
图1为本发明实施例提供的嵌入式系统制作补丁的方法的流程图;
图2是本发明实施例提供的使用GNU提供的gcc工具链生成osImage文件,osImage.bin文件的示意图;
图3是本发明实施例提供的从osImage文件中提取符号,并根据该结构生成符号文件的示意图。
图4是本发明实施例提供的搜索存储在内存上的osImage.bin文件,以及修改osImage.bin文件的流程图;
图5是本发明实施例提供的一种嵌入式系统制作补丁的系统的结构图。
具体实施方式
为描述方便,统称有软件错误而需要打补丁的原函数叫做被补丁函数;修改了软件错误的新函数叫做补丁函数。本发明实施例提到的段、节分别取自于工具界面(TIS,Tools Interface Standard)委员会发布的ELF标准所述的segment,section。如果没有特殊说明,补丁文件指的是包含补丁函数的源文件经过编译之后生成的目标文件。系统指的是经过编译之后最后能生成osImage的代码。osImage文件指的是包含了各种调试信息、符号表的系统镜像文件,osImage.bin文件是使用objcopy工具从osImage复制过来的,去掉各种调试信息和符号表的二进制文件。符号文件为从osImage文件获取的符号的集合,包括被补丁函数以及其他不需要打补丁的函数。
本发明实施例提供了一种嵌入式系统制作补丁的方法,如图1所示,包括:
步骤101,在系统镜像文件设置用于存储补丁函数的补丁预留区域;
步骤102,获取并存储符号文件;
步骤103,获取补丁文件,并根据符号文件对补丁文件进行符号解析、地址重定位,得到补丁函数在该补丁预留区域的地址;
步骤104,根据补丁函数在该补丁预留区域的地址将该补丁函数存储到该补丁预留区域,并修改该被补丁函数的地址为该补丁函数在该补丁预留区域的地址,使其能跳转到该补丁函数;
其中,系统镜像文件为可执行和链接格式。
其中,补丁文件包含了一个或者多个函数,这些函数可能是补丁函数,也能是新定义的函数;除了函数,补丁文件还包括函数用到的一些全局变量。补丁文件经过编译器的编译,最后生成的目标文件会被编译器组织成多个段,包括代码段、数据段、BSS段等等。所有函数经过编译之后生成的汇编代码放在代码段;补丁文件包含的有初始化值的全局变量放在数据段;没有初始化值的全局变量放在BSS段。
进一步地,由补丁预留区域的头部信息对补丁预留区域进行限定,补丁预留区域的头部信息包括:补丁预留区域的标识、补丁预留区域可用大小、补丁预留区域已用大小、已经打上补丁的个数和补丁节区的个数。
进一步地,修改该被补丁函数的地址为该补丁函数在该补丁预留区域的地址,包括:
确定该符号文件中是否存在补丁函数名称,如果存在,确定被补丁函数的地址,并被补丁函数的地址处的代码,加入跳转指令,跳转地址为补丁函数在该补丁预留区域的地址。
进一步地,根据符号文件对补丁文件进行符号解析包括:
判断补丁预留区域是否有补丁预留区域的标识,如果是,则获取补丁预留区域的剩余大小;
获取补丁文件的符号,确定补丁文件的符号是否在该符号文件中存在,如果存在,则确定补丁文件的大小,如果补丁文件的大小未超过补丁预留区域的剩余大小,则在补丁预留区域建立一个新的补丁区域,用于存放本次补丁所有的代码跟数据,以及确定存放补丁文件的补丁节区的头信息,该头信息包括:所在节的类型、距离补丁预留区域头部的偏移地址、被补丁函数的地址、补丁函数在补丁预留区域的地址、本节的大小和本节的对齐方式;
根据补丁预留区域的初始值确定补丁函数在补丁预留区域的地址为补丁函数在补丁文件的地址与新建立的补丁区域距离补丁预留区域头部的偏移地址的和值。
进一步地,根据符号文件对补丁文件进行地址重地位包括:
读取补丁文件的代码重定位节,找到所有需要重定位的外部符号,根据外部符号的符号名查找符号文件里符号表项,若找到,则用被补丁函数所在地址填充需重定位的符号地址;若没找到,则报错退出;如果需要重定位的是补丁文件定义的函数,则该函数地址重新赋值为:该函数在补丁文件中的地址与新建立的补丁区域在补丁预留区域的地址的和值,并保存补丁函数名称和补丁函数在补丁预留区域的地址。
进一步地,将新建立的存放补丁文件的补丁节区的头信息写入系统镜像文件,并更新补丁预留区域的头部信息。
例如:现在有个函数funcA需要打补丁,因此将函数funcA称为被补丁函数。为了能对函数funcA打上补丁,专门制作了一个补丁文件fileA。fileA定义了两个函数funcB跟funcC。其中funcB是补丁函数,funcC是fileA新定义的函数。funcC调用了系统函数funcD。
下面结合附图对本发明实施例进行详细的描述,具体如下:
如图2所示,为利用使用GNU提供的gcc工具链生成打补丁需要用到的两个文件osImage和osImage.bin的过程。
根据GNU组织提供的GCC工具链,所有源文件通过编译器编译、链接器链接最后生成可执行和链接格式(ELF,Executable and Linking Format)的osImage文件。根据TIS委员会发布的ELF标准,最后编译生成的osImage文件包括了数据段、代码段和业务支撑系统(BSS,Business Support System)段以及符号节。所有源文件定义的全局变量,静态变量,全局函数,静态函数的符号信息都保存在osImage文件的符号节里。使用objcopy工具,将osImage文件的代码段、数据段和BSS段复制出来生成osImage.bin文件。
在本发明实施例中,定义一个有初始化值的大数组patchSection,使得使用编译器编译系统代码时,能将该大数组放在最后生成的系统镜像文件osImage.bin的数据段里,预留给补丁函数使用,为描述方便,通称该区域为补丁预留区域。如表1所示的格式定义了补丁预留区域的数据存储格式,结构体PatchEhdr定义了补丁预留区域的头部信息:
#define PATCH_SECTION_SIZE(64*1024)typedef unsigned short patchHalf;typedef unsigned int patchWord;typedef signed int patchSword;typedef unsigned int patchOff;typedef unsigned int patchAddr;typedef unsigned char patchChar;typedef struct{patchChar patIdent[16];patchWord totalSize;patchWord usedSize;patchHalf patchNum;patchHalf sectionNum;}PatchEhdr; |
表1
其中,patIdent用来标识头部信息,只有头部信息是“PATCH”才是本发明实施例提供的补丁预留区域。
其中totalSize指明整个补丁预留区域可用大小。
其中usedSize表示补丁预留区域已用大小。
其中patchNum表示已经打上补丁的个数。
其中sectionNum表示节区的个数。
如表2所示,结构体PatchShdr定义了补丁预留区域存放补丁文件数据段、代码段的补丁节区头信息:
typedef struct{patchChar patchType;patchOff patchOffset;patchAddr patchPaddr;patchAddr patchNaddr;patchWord patchSectionsz;patchWord patchAlign;patchWord patchNhdr;}PatchShdr; |
表2
其中patchType表示所在节的类型,包括两种:数据段(0x1)跟代码段(0x2)。
其中patchOffset表示距离补丁预留区域头部的偏移地址。
其中patchPaddr表示被补丁函数的原地址,该值需要根据符号表来更新。
其中patchNaddr表示补丁函数所在地址,该值需要本发明实施例提供的链接器来确定。
其中patchSectionsz表示本节的大小,需要本发明实施例提供的链接器来确定。
其中patchAlign表示本节的对齐方式,按4字节,16字节,或者4096字节对齐,等等,具体情况要根据节的类型而定。
其中patchNhdr表示下一个节区所在的偏移。如果本节为最后一个节区,则该值为0,指向第一个节区。
如表3所示,在系统里定义个大数组,数组名patchSection,该数组名在以后的步骤里将用到,并且根据结构体PatchEhdr定义了补丁预留区域的头部信息,patchSection初始化值是:
char patchSection[sizeef(PatchEhdr)+PATCH_SECTION_SIZE]={′P′,′A′,′T′,′C′,′H′,0,0,0,0,0,0,0,0,0,0,0,PATCH_SECTION_SIZE,0,0,0}; |
表3
补丁头标示:“PATCH”;每次打补丁,修改flash上的osImage.bin文件时,找到补丁预留区域之后都需要判断该字段的值是否为“PATCH”,如果为否,则打补丁操作自动停止;
totalSize:指定补丁预留区域的可用大小,这里指定值为65536,该值可根据实际情况调整大小;
usedSize:初始化值为0;
patchNum:初始化值为0;
sectionNum:初始化值为0;
如表4所示,定义了本发明实施例提供的链接器需要使用到的符号表的结构。在以后的描述中,如没有特殊指明,所述链接器指的都是本发明实施例提供的链接器。
typedef struct{patchChar symName[32];patchAddr symAddr;patchAddr symSize;patchAddr symOff;patchChar symType;patchChar symOther;}PatchSym; |
表4
symName:指定了符号的名字,在此,符号代指函数或者变量,以下类同。当链接器进行符号解析、地址重定位的时候需要根据该符号名来查找。
symAddr:指定符号在内存里的地址。如果该符号表示一个段/节,该值表示段/节在内存里的起始地址。
symSize:表示符号所占的空间大小。
symOff:表示符号在osImage.bin文件里相对于段的偏移,如果是变量,则相对于数据段;如果是函数,则相对于代码段;
symType:字符类型的成员。高四个bit表示符号的绑定类型,分几种:全局类型(0x1),弱类型(0x2),静态类型(0x0)。低四个bit表示符号类型,分:变量(0x1),函数(0x2),节(0x3)。
可选地,symOther:留作将来扩展使用。
如图3所示,该过程为本发明实施例提供的从osImage文件中提取符号文件的方法,在本发明实施例中,该符号文件被命名为symbol.txt:
首先读取osImage文件的ELF头部信息,根据头部信息找到符号节所在位置。
具体地,根据ELF文件格式,符号节区头给出了符号节的表项数目,每个表项代表一个符号,逐个解析每个读出来的表项:
根据读出来的st_name索引找到字符串节区的偏移,找到的字符串为该符号名,将该字符串赋值给symName字段;
表项的st_value值赋给symAddr,该值表示符号加载到内存时的内存地址。需要说明的是,符号文件有两个额外的表项,分别表示数据段、代码段,其地址从数据段,代码段的节头信息获取;
表项st_size赋值给symSize,表示符号占用内存的大小;
表项st_info赋值给symType;
表项st_other赋值给symOther;
读取代码段、数据段的节头信息,根据节头信息的地址(ELF标准定义st_addr)跟偏移(ELF标准定义sh_offset)计算出符号的symOff,具体计算公式如下:
(symAddr-st_addr+sh_offset)
并将该值赋值给symOff。保存该值的目的是为方便修改flash里的osImage.bin。
文件osImage符号节所有表项处理完后,还需要添加两个额外的表项:
代码段。symName填充成”text”,symAddr值取自于代码段节头信息的ELF标准定义sh_addr字段;symSize取自于代码段节头信息的ELF标准定义sh_size字段;symType低4bit位赋值为0x3,表示符号为节;symOff取自于osImage.bin文件的代码段节头信息的ELF标准定义sh_offset
数据段。symName填充成”data”,symAddr值取自于数据段节头信息的ELF标准定义sh_addr字段;symSize取自于数据段节头信息的ELF标准定义sh_size字段;symType低4bit位赋值为0x3,表示符号为节;symOff取自于osImage.bin文件的代码段节头信息的ELF标准定义sh_offset。
如图4所示,该过程是将补丁文件编译之后下载到设备内存里,使用链接器对补丁文件重新定位的过程,并且完成对osImage.bin文件修改,使得被补丁函数在系统上电的时候能够自动跳转到补丁函数。
假设补丁文件名为p.c,使用编译工具编译成p.o,命令行如:
cc-cp.c-op.o
p.o经过编译工具编译生成了ELF格式中的一种:所谓的可重定位的目标文件。因为此类型的目标文件,不管是所引用的外部变量、还是引用的函数,其地址都没有最终确定,文件里定义的函数、变量的运行地址也没有确定,因此该目标文件不能被CPU执行,将补正文件p.o下载到内存里之后,必须完成符号解析、地址重定位过程。基于此,本发明提供了一种简单链接器用于解决该问题,步骤如下:
首先根据图3提供的方法提取出的符号表生成符号文件symbol.txt,在该文件中,每个变量或者函数都会有其对应表项,将符号文件下载到内存里。在内存里搜索patchSection,如果没找到,则表示系统不支持本发明实施例提供的补丁方法,退出。若找到,则搜索补丁文件p.o,根据符号文件的格式定义,找到变量patchSection的对应表项,根据PatchSym定义,获取其对应表项的symOff值,其目的是为了找到osImage.bin文件中变量patchSection的位置。
打开保存在flash上的osImage.bin文件(步骤801),并判断是否打开成功(步骤801),如果文件不存在,或者打不开文件,则退出(步骤803)。否则,根据获取的symOff字段(步骤804),读取osImage.bin文件偏移symOff处的数值,大小为sizeof(PatchEhdr)字节的数据(步骤805)。
解析补丁预留区域的头部信息,首先验证头部信息的标志符是否为“PATCH”(步骤806),如果不是,则退出(步骤807);如果是,则进行符号解析。首先读取补丁文件p.o的符号节(步骤808),逐个解析每个表项,判断符号表项是否为空(步骤809),如果不为空,则判断该符号是否为外部符号(步骤810),如果是外部符号,则根据符号名查找符号文件,确定该符号是否在符号文件里存在(步骤811),如果该符号不存在,报错退出(步骤812);若存在,则转向步骤809。如果该符号不是外部符号,则转向步骤808。如果符号表项为空,则计算补丁文件需要的区域大小(步骤813)。具体地,计算补丁文件数据段、代码段和BSS段的总大小,查看补丁预留区域的剩余大小(步骤814),具体为补丁预留区域的总大小(totalSize)减去补丁预留区域已用大小(usedSize),如果补丁文件大小超过补丁预留区域大小,则报错退出(步骤815),否则给补丁文件分配大小。在内存里建立一个PatchShdr结构,patchType值为0x1(代码段);如果补丁文件有数据段和BSS段,则需另外建立一个PatchShdr结构,patchType值为0x2;从补丁文件获取代码段大小,填充patchSectionsz;如果有数据段和BSS段,则获取数据段与BSS段之和填充patchSectionsz(步骤816)。
如果补丁预留区域头部信息的patchNum为0,patchOffset填充为sizeof(PatchEhdr),patchNhdr取值为patchOffset;读取符号文件,取得符号文件里变量patchSection的对应表项的symAddr值以用于计算patchNaddr的值,patchNaddr的值的计算方法为:symAddr与patchOffset的和值。如果是代码段patchNaddr按4对齐,如果是数据段,则读取补丁文件的数据段头信息,取对齐方式,按头信息要求的对齐方式对齐。
如果补丁预留区域头部信息的patchNum不为0,则读取第一个补丁节区的头信息,根据其patchNhdr字段找到补丁节区链表最后一个PatchShdr头。根据链表尾补丁节区PatchShdr头的patchSectionsz和patchOffset计算出新的补丁节区头的偏移地址,用该值更新新建立的PatchShdr的patchOffset字段;第一个补丁节区的头信息中的patchNhdr字段更新为新的补丁节区头的偏移地址;用该值更新第一个补丁节区头信息里的patchNhdr字段,这样新建立的PatchShdr成为补丁节区链表最后一个节区头;读取符号文件,取得对应patchSection表项的symAddr值用于计算patchNaddr的值,patchNaddr的值的计算方法为:symAddr与patchOffset的和值。如果是代码段patchNaddr按4对齐,如果是数据段,则读取补丁文件的数据段头信息,取对齐方式,按头信息要求的对齐方式对齐。
进行地址重定位步骤。首先读取补丁文件的代码重定位节(步骤817),逐项查找需要重定位的符号(步骤818),判断该符号是否为外部符号(步骤819),如果是,则根据外部符号的符号名查找符号文件里符号表项(步骤820),判断是否查找到符号(步骤821),若找到,则用patchsection表项里的symAddr字段填充需重定位的符号地址(步骤822);若没找到,则报错退出(步骤823)。如果需要重定位的是补丁文件定义的函数,则函数地址重新赋值为:符号地址与新建立的代码节的patchNaddr的和(步骤824),并转向步骤825;重定位之后,将代码段拷贝到新增的代码节区。建立一个如表5的FuncSym结构体数组。
typedet struct{patchChar symName[32];patchAddr symAddr;}FuncSym; |
表5
提取出符号文件代码段里所有全局函数的函数名,跟地址保存在FuncSym数组里,用于修改被补丁函数的代码。
判断该定位符号是否为重定位节的最后一个符号(步骤825),如果否,则读取补丁文件的重定位节(步骤817);如果是,在判断是否有数据重定位节,如果有,则读取补丁文件的重定位节(步骤817),重定位方法跟代码重定位节类似。重定位完了之后将数据段、BSS段拷贝到数据节区。如果没有,则将内存里新建立的PatchShdr结构写进osImage.bin文件,并更新补丁预留区域的头信息中的usedSize、patchNum和sectionNum字段。将修改的补丁预留区域的头部信息写入osImage.bin文件里相应区域(步骤827),并退出(步骤828)。
具体地,userSize字段加上新增的各个节区的patchSectionsz,patchNum加1,sectionNum加上新增的补丁节区数。
修改osImage.bin里的被补丁函数,使得系统加载osImage.bin上电时,能够自动完成从被补丁函数到补丁函数的跳转。本发明提供的方法如:
根据提供的FuncSym数组提供的函数名,逐个查找符号文件,若找到,则所找到的表项的symOff字段为被补丁函数在osImage.bin中的偏移。修改osImage.bin文件偏移symOff处的代码,加入跳转指令,地址为FuncSym的symAddr值。
基于与方法相同的发明构思,本发明实施例提供了一种嵌入式系统制作补丁的系统,如图5所示,包括:
设置模块,用于在系统镜像文件设置用于存储补丁函数的补丁预留区域。
获取和存储模块,用于获取并存储符号文件;
获取模块,用于获取补丁文件,并根据符号文件对补丁文件进行符号解析、地址重定位,得到补丁函数在该补丁预留区域的地址;
修补模块,用于根据补丁函数在该补丁预留区域的地址将该补丁函数存储到该补丁预留区域,并修改该被补丁函数的地址为该补丁函数在该补丁预留区域的地址。
其中,系统镜像文件为可执行和链接格式。
进一步地,设置模块,具体用于对补丁预留区域的头部信息对补丁预留区域进行限定,其中,补丁预留区域的头部信息包括:补丁预留区域的标识、补丁预留区域可用大小、补丁预留区域已用大小、已经打上补丁的个数和补丁节区的个数。
进一步地,该获取模块,用于根据符号文件对补丁文件进行符号解析包括:
该获取模块,用于判断补丁预留区域是否有补丁预留区域的标识,如果是,则获取补丁预留区域的剩余大小;
获取补丁文件的符号,确定补丁文件的符号是否在该符号文件中存在,如果存在,则确定补丁文件的大小,如果补丁文件的大小未超过补丁预留区域的剩余大小,则在补丁预留区域建立一个新的补丁区域,用于存放本次补丁所有的代码跟数据,以及确定存放补丁文件的补丁节区的头信息,该头信息包括:所在节的类型、距离补丁预留区域头部的偏移地址、被补丁函数的地址、补丁函数在补丁预留区域的地址、本节的大小和本节的对齐方式;
根据补丁预留区域的初始值确定补丁函数在补丁预留区域的地址为被补丁函数所在地址与距离补丁预留区域头部的偏移地址的和值。
进一步地,该获取模块,用于根据符号文件对补丁文件进行地址重定位包括:
该获取模块,具体用于读取补丁文件的代码重定位节,找到所有需要重定位的外部符号,根据外部符号的符号名查找符号文件里符号表项,若找到,则用被补丁函数所在地址填充需重定位的符号地址;若没找到,则报错退出;如果需要重定位的是补丁文件定义的函数,则补丁函数地址重新赋值为:符号地址与新建立的补丁函数在补丁预留区域的地址的和值,并保存补丁函数名称和补丁函数在补丁预留区域的地址。
进一步地,该系统还包括:写入更新模块,用于将新建立的存放补丁文件的补丁节区的头信息写入系统镜像文件,并更新补丁预留区域的头部信息。
进一步地,该修补模块,具体用于确定该符号文件中是否存在补丁函数名称,如果存在,确定被补丁函数的地址,并将被补丁函数的地址处的代码,加入跳转指令,跳转地址为补丁函数在该补丁预留区域的地址。
本发明通过在系统镜像文件设置用于存储补丁函数的补丁预留区域;获取并存储符号文件;获取补丁文件,并根据符号文件对补丁文件进行符号解析、地址重定位,得到补丁函数在补丁预留区域的地址;根据补丁函数在补丁预留区域的地址将所述补丁函数存储到补丁预留区域,并修改被补丁函数的地址为补丁函数在所述补丁预留区域的地址,使其能跳转到所述补丁函数,可以使得设备重新上电的时候补丁仍然有效,简化了用户操作,降低了系统成本。
最后应当说明的是,以上实施例仅用以说明本发明的技术方案而非限制,尽管参照较佳实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,可以对本发明进行修改、更改或者等同替换,而不脱离本发明和权利要求的精神和范围。
Claims (10)
1.一种嵌入式系统制作补丁的方法,其特征在于,包括:
在系统镜像文件设置用于存储补丁函数的补丁预留区域;
获取并存储符号文件;
获取补丁文件,并根据符号文件对补丁文件进行符号解析、地址重定位,得到补丁函数在所述补丁预留区域的地址;
根据补丁函数在所述补丁预留区域的地址将所述补丁函数存储到所述补丁预留区域,并修改被补丁函数的地址为所述补丁函数在所述补丁预留区域的地址。
2.如权利要求1所述的方法,其特征在于,由补丁预留区域的头部信息对补丁预留区域进行限定,补丁预留区域的头部信息包括:补丁预留区域的标识、补丁预留区域可用大小、补丁预留区域已用大小、已经打上补丁的个数和补丁节区的个数。
3.如权利要求2所述的方法,其特征在于,根据符号文件对补丁文件进行符号解析包括:
判断补丁预留区域是否有补丁预留区域的标识,如果是,则获取补丁预留区域的剩余大小;
获取补丁文件的符号,确定补丁文件的符号是否在所述符号文件中存在,如果存在,则确定补丁文件的大小,如果补丁文件的大小未超过补丁预留区域的剩余大小,则在补丁预留区域建立一个新的补丁区域,用于存放本次补丁所有的代码跟数据,以及确定存放补丁文件的补丁节区的头信息,所述头信息包括:所在节的类型、距离补丁预留区域头部的偏移地址、被补丁函数的地址、补丁函数在补丁预留区域的地址、本节的大小和本节的对齐方式;
根据补丁预留区域的初始值确定补丁函数在补丁预留区域的地址为被补丁函数所在地址与距离补丁预留区域头部的偏移地址的和值。
4.如权利要求3所述的方法,其特征在于,根据符号文件对补丁文件进行地址重定位包括:
读取补丁文件的代码重定位节,找到所有需要重定位的外部符号,根据外部符号的符号名查找符号文件里符号表项,若找到,则用被补丁函数所在地址填充需重定位的符号地址;若没找到,则报错退出;如果需要重定位的是补丁文件定义的函数,则补丁函数地址重新赋值为:符号地址与新建立的补丁函数在补丁预留区域的地址的和值,并保存补丁函数名称和补丁函数在补丁预留区域的地址。
5.如权利要求1所述的方法,其特征在于,所述系统镜像文件为可执行和链接格式。
6.一种嵌入式系统制作补丁的系统,其特征在于,包括:
设置模块,用于在系统镜像文件设置用于存储补丁函数的补丁预留区域。
获取和存储模块,用于获取并存储符号文件;
获取模块,用于获取补丁文件,并根据符号文件对补丁文件进行符号解析、地址重定位,得到补丁函数在所述补丁预留区域的地址;
修补模块,用于根据补丁函数在所述补丁预留区域的地址将所述补丁函数存储到所述补丁预留区域,并修改所述被补丁函数的地址为所述补丁函数在所述补丁预留区域的地址。
7.如权利要求6所述的系统,其特征在于,设置模块,具体用于对补丁预留区域的头部信息对补丁预留区域进行限定,其中,补丁预留区域的头部信息包括:补丁预留区域的标识、补丁预留区域可用大小、补丁预留区域已用大小、已经打上补丁的个数和补丁节区的个数。
8.如权利要求7所述的系统,其特征在于,所述获取模块,用于根据符号文件对补丁文件进行符号解析包括:
所述获取模块,用于判断补丁预留区域是否有补丁预留区域的标识,如果是,则获取补丁预留区域的剩余大小;
获取补丁文件的符号,确定补丁文件的符号是否在所述符号文件中存在,如果存在,则确定补丁文件的大小,如果补丁文件的大小未超过补丁预留区域的剩余大小,则在补丁预留区域建立一个新的补丁区域,用于存放本次补丁所有的代码跟数据,以及确定存放补丁文件的补丁节区的头信息,所述头信息包括:所在节的类型、距离补丁预留区域头部的偏移地址、被补丁函数的地址、补丁函数在补丁预留区域的地址、本节的大小和本节的对齐方式;
根据补丁预留区域的初始值确定补丁函数在补丁预留区域的地址为被补丁函数所在地址与距离补丁预留区域头部的偏移地址的和值。
9.如权利要求8所述的系统,其特征在于,所述获取模块,用于根据符号文件对补丁文件进行地址重地位包括:
所述获取模块,具体用于读取补丁文件的代码重定位节,找到所有需要重定位的外部符号,根据外部符号的符号名查找符号文件里符号表项,若找到,则用被补丁函数所在地址填充需重定位的符号地址;若没找到,则报错退出;如果需要重定位的是补丁文件定义的函数,则补丁函数地址重新赋值为:符号地址与新建立的补丁函数在补丁预留区域的地址的和值,并保存补丁函数名称和补丁函数在补丁预留区域的地址。
10.如权利要求9所述的系统,其特征在于,还包括:写入更新模块,用于将新建立的存放补丁文件的补丁节区的头信息写入系统镜像文件,并更新补丁预留区域的头部信息。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2010101994069A CN101882094A (zh) | 2010-06-10 | 2010-06-10 | 嵌入式系统制作补丁的方法和系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2010101994069A CN101882094A (zh) | 2010-06-10 | 2010-06-10 | 嵌入式系统制作补丁的方法和系统 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN101882094A true CN101882094A (zh) | 2010-11-10 |
Family
ID=43054114
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2010101994069A Pending CN101882094A (zh) | 2010-06-10 | 2010-06-10 | 嵌入式系统制作补丁的方法和系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101882094A (zh) |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103218241A (zh) * | 2013-04-19 | 2013-07-24 | 华为技术有限公司 | 补丁加载方法和装置 |
CN103559449A (zh) * | 2013-11-15 | 2014-02-05 | 华为技术有限公司 | 一种代码改动的检测方法及装置 |
CN104239082A (zh) * | 2013-06-20 | 2014-12-24 | 上海博达数据通信有限公司 | 嵌入式系统的热补丁实现方法 |
CN104506367A (zh) * | 2014-12-24 | 2015-04-08 | 上海斐讯数据通信技术有限公司 | 一种升级管理系统 |
CN104679660A (zh) * | 2015-03-26 | 2015-06-03 | 成都彬鸿科技有限公司 | 基于符号表的嵌入式系统调试方法和装置 |
CN107656753A (zh) * | 2016-07-25 | 2018-02-02 | 中兴通讯股份有限公司 | 一种补丁实现方法及装置 |
WO2020238245A1 (zh) * | 2019-05-30 | 2020-12-03 | 华为技术有限公司 | 实现函数跳转的方法、装置及计算机存储介质 |
WO2021115036A1 (zh) * | 2019-12-13 | 2021-06-17 | 中兴通讯股份有限公司 | Linux内核热补丁实现方法、电子设备及计算机可读介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20040003266A1 (en) * | 2000-09-22 | 2004-01-01 | Patchlink Corporation | Non-invasive automatic offsite patch fingerprinting and updating system and method |
CN101211265A (zh) * | 2006-12-28 | 2008-07-02 | 英华达(上海)电子有限公司 | 一种终端嵌入式系统的软件更新方法和装置 |
CN101346693A (zh) * | 2006-06-15 | 2009-01-14 | 三星电子株式会社 | 产生、链接和更新基于组件的软件的方法和其上记录有这种软件的信息存储介质 |
-
2010
- 2010-06-10 CN CN2010101994069A patent/CN101882094A/zh active Pending
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20040003266A1 (en) * | 2000-09-22 | 2004-01-01 | Patchlink Corporation | Non-invasive automatic offsite patch fingerprinting and updating system and method |
CN101346693A (zh) * | 2006-06-15 | 2009-01-14 | 三星电子株式会社 | 产生、链接和更新基于组件的软件的方法和其上记录有这种软件的信息存储介质 |
CN101211265A (zh) * | 2006-12-28 | 2008-07-02 | 英华达(上海)电子有限公司 | 一种终端嵌入式系统的软件更新方法和装置 |
Cited By (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103218241A (zh) * | 2013-04-19 | 2013-07-24 | 华为技术有限公司 | 补丁加载方法和装置 |
CN103218241B (zh) * | 2013-04-19 | 2016-08-31 | 华为技术有限公司 | 补丁加载方法和装置 |
CN104239082A (zh) * | 2013-06-20 | 2014-12-24 | 上海博达数据通信有限公司 | 嵌入式系统的热补丁实现方法 |
CN104239082B (zh) * | 2013-06-20 | 2019-01-15 | 上海博达数据通信有限公司 | 嵌入式系统的热补丁实现方法 |
CN103559449B (zh) * | 2013-11-15 | 2016-09-21 | 华为技术有限公司 | 一种代码改动的检测方法及装置 |
CN103559449A (zh) * | 2013-11-15 | 2014-02-05 | 华为技术有限公司 | 一种代码改动的检测方法及装置 |
CN104506367A (zh) * | 2014-12-24 | 2015-04-08 | 上海斐讯数据通信技术有限公司 | 一种升级管理系统 |
CN104679660A (zh) * | 2015-03-26 | 2015-06-03 | 成都彬鸿科技有限公司 | 基于符号表的嵌入式系统调试方法和装置 |
CN107656753A (zh) * | 2016-07-25 | 2018-02-02 | 中兴通讯股份有限公司 | 一种补丁实现方法及装置 |
WO2020238245A1 (zh) * | 2019-05-30 | 2020-12-03 | 华为技术有限公司 | 实现函数跳转的方法、装置及计算机存储介质 |
US11645068B2 (en) | 2019-05-30 | 2023-05-09 | Huawei Technologies Co., Ltd. | Method for implementing function jump, apparatus, and computer storage medium |
WO2021115036A1 (zh) * | 2019-12-13 | 2021-06-17 | 中兴通讯股份有限公司 | Linux内核热补丁实现方法、电子设备及计算机可读介质 |
US11868763B2 (en) | 2019-12-13 | 2024-01-09 | Zte Corporation | Method for implementing Linux kernel hot patch, electronic device, and computer readable medium |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101882094A (zh) | 嵌入式系统制作补丁的方法和系统 | |
CN107506219A (zh) | 一种基于Android系统的通用版本升级方法 | |
JP5208350B2 (ja) | 自己記述型ソフトウェアイメージ更新コンポーネント | |
EP2273361B1 (en) | Method and system for updating versions of content stored in a storage device | |
CN101697131B (zh) | 一种可重定位文件动态加载的方法及装置 | |
US8296535B2 (en) | Generating incremental program updates | |
TWI566180B (zh) | 一種動態創建可附加和可拆除二進位檔案的系統和方法 | |
Reijers et al. | Efficient code distribution in wireless sensor networks | |
CN103744709B (zh) | 补丁加载方法及装置 | |
TWI439931B (zh) | 用於增加三角差動效能之目的碼之產生 | |
CN100368995C (zh) | 一种单片机系统在运行中升级的装置和方法 | |
US7676479B2 (en) | Method and system for updating versions of content stored in a storage device | |
CN104239082A (zh) | 嵌入式系统的热补丁实现方法 | |
CN105224309A (zh) | 一种调取函数的方法和装置 | |
CN101334737A (zh) | 一种嵌入式设备的启动或复位方法 | |
CN104380250B (zh) | 一种动态创建可附加和可拆除二进制文件的系统和方法 | |
CN115167862A (zh) | 补丁方法及相关设备 | |
JP3792232B2 (ja) | 情報処理装置及び格納位置管理方法及びプログラム | |
CN100517220C (zh) | 对存储在存储装置中的内容的版本进行更新的方法和系统 | |
CN117931250A (zh) | 一种分段固化及加载方法 | |
JP2002108625A (ja) | 言語処理装置及び言語処理プログラムを格納した記録媒体 | |
CN100405296C (zh) | 扩展串行引导代码量的方法 | |
GB2450610A (en) | Using stubs to link independently generated code images | |
Gharehbaghi et al. | Intermediate Format Standardization: Ambiguities, Deficiencies, Portability issues, Documentation and Improvements | |
JP2002297388A (ja) | システムパートプログラムのダウンロード方法、それに用いるシステムメモリおよびシステムパートプログラム |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C12 | Rejection of a patent application after its publication | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20101110 |