CN106547573B - 一种程序文件对比方法及装置 - Google Patents

一种程序文件对比方法及装置 Download PDF

Info

Publication number
CN106547573B
CN106547573B CN201611111304.0A CN201611111304A CN106547573B CN 106547573 B CN106547573 B CN 106547573B CN 201611111304 A CN201611111304 A CN 201611111304A CN 106547573 B CN106547573 B CN 106547573B
Authority
CN
China
Prior art keywords
program
program file
file
section
obtaining
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
Application number
CN201611111304.0A
Other languages
English (en)
Other versions
CN106547573A (zh
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.)
Hundsun Technologies Inc
Original Assignee
Hundsun Technologies Inc
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 Hundsun Technologies Inc filed Critical Hundsun Technologies Inc
Priority to CN201611111304.0A priority Critical patent/CN106547573B/zh
Publication of CN106547573A publication Critical patent/CN106547573A/zh
Application granted granted Critical
Publication of CN106547573B publication Critical patent/CN106547573B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

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/70Software maintenance or management
    • G06F8/71Version control; Configuration management
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/73Program documentation

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Security & Cryptography (AREA)
  • Library & Information Science (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本申请提供的程序文件对比方法,在比较上次版本和当前版本对应的程序集文件之前,首先,获取两个版本的程序集中文件名称相同的程序文件,分别获取两个程序文件中的非代码变量节点,并将两个程序文件中的非代码变量节点都替换为预设字符,即经过替换后,两个程序文件的非代码变量完全相同。然后,比较处理后的程序文件的文件内容是否相同,如果不相同,表明两个版本的程序文件的代码部分有差异,存储当前版本对应的该程序文件。利用该方法能够自动识别出两个版本的程序文件中代码部分有差异的文件,不需要人工挑选有修改的程序文件,大大提高了对比效率,且提高了对比准确率。

Description

一种程序文件对比方法及装置
技术领域
本发明属于领域计算机技术领域,尤其涉及一种程序文件对比方法及装置。
背景技术
在一个程序发布后,如果对已发布的程序进行更新,通常采用增量发布方式。所谓增量发布方式是指只发布代码部分有修改的程序文件(即,增量包),没有修改的程序文件不再和有修改的程序文件一起发布。客户端也只需要下载增量发布的程序包即可对程序进行更新,所需的下载量大大减小,而且加快了更新速度。
增量包发布时,通常需要配置管理员手工从程序集中逐个挑选出有修改的程序文件,构成增量包然后发布。对于大项目可能包含成千上百个文件,手工挑选代码修改的文件非常耗时而且容易出错。
发明内容
有鉴于此,本发明的目的在于提供一种程序文件对比方法及装置,以解决采用手工挑选代码修改文件耗时、准确率低的问题。
第一方面,本申请提供一种程序文件对比方法,应用于基于可执行链接格式ELF文件的程序集中,该方法包括:
分别从编译后的上次版本和当前版本的程序集中,获取文件名称相同的第一程序文件和第二程序文件;
获得所述第一程序文件和所述第二程序文件的头部结构体,所述头部结构体包括ELF头部、程序头部表和节区头部表;
根据所述第一程序文件的头部结构体,分别获取所述第一程序文件所包含的注释信息、符号调试信息及时间戳信息,以及,根据所述第二程序文件的头部结构体获取所述第二程序文件所包含的注释信息、符号调试信息及时间戳信息;
分别将所述第一程序文件中的注释信息、符号调试信息及时间戳信息对应的内容替换为预设字符,得到第一待对比程序文件,以及,将所述第二程序文件中的注释信息、符号调试信息及时间戳信息对应的内容替换为所述预设字符,得到第二待对比程序文件;
比较所述第一待对比程序文件和所述第二待对比程序文件的文件内容是否相同,如果不相同,则确定所述第一程序文件与所述第二程序文件的代码内容不相同。
可选地,所述获取所述第一程序文件所包含的注释信息,包括:
查询所述节区头部表,获得类型为SHT_NOTE的节区的偏移量和结构体长度;
根据所述类型为SHT_NOTE的节区的偏移量和结构体长度,获得.note节区,所述.note节区用于保存所述注释信息。
可选地,获取所述第一程序文件所包含的符号调试信息,包括:
查询所述节区头部表,获得类型为SHT_PROGBITS的节区的偏移量和结构体长度;
根据所述类型为SHT_PROGBITS的节区的偏移量和结构体长度,获得.debug节区,所述.debug节区用于保存所述符号调试信息。
可选地,获取所述第一程序文件所包含的时间戳信息,包括:
查询所述节区头部表,获得类型为SHT_STRTAB的节区,查找.shstrtab结构体,并找到节区名称.strtab对应的数字id,以及节区名称.symtab对应的数字id;
遍历SHT_STRTAB节区,根据所述.strtab对应的数字id获得字符串索引strindex;根据所述.symtab对应的数字id获得符号索引symindex;
遍历终端设备本地的节区头部结构体数组中的数字id,查找与所述.strindex匹配的项所对应的数组下标Bindex,以及查找与所述symindex匹配的项所对应的数组下标Aindex;
根据所述Bindex从strtab节区中查找节区名称为GetBizFunctionsInfo的节区对应的数字id;
根据所述Aindex从.symtab节区中查找st_name字段值为GetBizFunctionsInfo对应数字id的结构体,获取存储时间戳的结构体的偏移量和结构体长度,并根据所述偏移量和结构体长度获得时间戳。
可选地,所述比较所述第一待对比程序文件和所述第二待对比程序文件的文件内容是否相同,包括:
对所述第一待对比程序文件进行MD5校验,得到第一MD5校验码;
对所述第二待对比程序文件进行MD5校验,得到第二MD5校验码;
比较所述第一MD5校验码与所述第二MD5校验码是否相同;如果相同,则确定所述第一程序文件与所述第二程序文件的文件内容相同;如果不相同,则确定所述第一程序文件与所述第二程序文件的文件内容不相同。
可选地,所述方法还包括:
记录代码内容不相同的程序文件的文件名称;
从当前版本的程序集中获取所述文件名称对应的程序文件;
将所述程序文件复制到输出目录中,直到比较完上次版本和当前版本的程序集中的所有程序文件后,得到程序增量包。
第二方面,本申请提供一种程序文件对比装置,应用于基于可执行链接格式ELF文件的程序集中,该装置包括:
第一获取模块,用于分别从编译后的上次版本和当前版本的程序集中,获取文件名称相同的第一程序文件和第二程序文件;
第二获取模块,用于通过结构体映射得到所述第一程序文件和所述第二程序文件的头部结构体,所述头部结构体包括ELF头部、程序头部表和节区头部表;
第三获取模块,用于根据所述第一程序文件的头部结构体,分别获取所述第一程序文件所包含的注释信息、符号调试信息及时间戳信息,以及,根据所述第二程序文件的头部结构体获取所述第二程序文件所包含的注释信息、符号调试信息及时间戳信息;
替换模块,用于分别将所述第一程序文件中的注释信息、符号调试信息及时间戳信息对应的内容替换为预设字符,得到第一待对比程序文件,以及,将所述第二程序文件中的注释信息、符号调试信息及时间戳信息对应的内容替换为所述预设字符,得到第二待对比程序文件;
比较模块,用于比较所述第一待对比程序文件和所述第二待对比程序文件的文件内容是否相同,如果不相同,则确定所述第一程序文件与所述第二程序文件的代码内容不相同。
可选地,所述第三获取模块用于获取所述第一程序文件所包含的注释信息时,包括:
第一获取子模块,用于查询所述节区头部表,获得类型为SHT_NOTE的节区的偏移量和结构体长度;
第二获取子模块,用于根据所述类型为SHT_NOTE的节区的偏移量和结构体长度,获得.note节区,所述.note节区用于保存所述注释信息。
可选地,所述第三获取模块用于获取所述第一程序文件所包含的符号调试信息时,包括:
第三获取子模块,用于查询所述节区头部表,获得类型为SHT_PROGBITS的节区的偏移量和结构体长度;
第四获取子模块,用于根据所述类型为SHT_PROGBITS的节区的偏移量和结构体长度,获得.debug节区,所述.debug节区用于保存所述符号调试信息。
可选地,所述第三获取模块用于获取所述第一程序文件所包含的时间戳信息时,包括:
第五获取子模块,用于查询所述节区头部表,获得类型为SHT_STRTAB的节区,查找.shstrtab结构体,并找到节区名称.strtab对应的数字id,以及节区名称.symtab对应的数字id;
第六获取子模块,用于遍历SHT_STRTAB节区,根据所述.strtab对应的数字id获得字符串索引strindex;根据所述.symtab对应的数字id获得符号索引symindex;
第一查找子模块,用于遍历终端设备本地的节区头部结构体数组中的数字id,查找与所述.strindex匹配的项所对应的数组下标Bindex,以及查找与所述symindex匹配的项所对应的数组下标Aindex;
第二查找子模块,用于根据所述Bindex从strtab节区中查找节区名称为GetBizFunctionsInfo的节区对应的数字id;
第三查找子模块,用于根据所述Aindex从.symtab节区中查找st_name字段值为GetBizFunctionsInfo对应数字id的结构体,获取存储时间戳的结构体对应的偏移量和结构体长度,并根据所述偏移量和结构长度获得所述时间戳。
可选地,所述比较模块,包括:
第一校验码获取子模块,用于对所述第一待对比程序文件进行MD5校验,得到第一MD5校验码;
第二校验码获取子模块,用于对所述第二待对比程序文件进行MD5校验,得到第二MD5校验码;
比较子模块,用于比较所述第一MD5校验码与所述第二MD5校验码是否相同;如果相同,则确定所述第一程序文件与所述第二程序文件的文件内容相同;如果不相同,则确定所述第一程序文件与所述第二程序文件的文件内容不相同。
可选地,所述装置还包括:
记录模块,用于记录代码内容不相同的程序文件的文件名称;
第四获取模块,用于从当前版本的程序集中获取所述文件名称对应的程序文件;
第五获取模块,用于将所述程序文件复制到输出目录中,直到比较完上次版本和当前版本的程序集中的所有程序文件后,得到程序增量包。
本发明以上实施例提供的程序文件对比方法,在比较上次版本和当前版本对应的程序集文件之前,首先,获取两个版本的程序集中文件名称相同的程序文件,分别获取两个程序文件中的非代码变量节点,并将两个程序文件中的非代码变量节点都替换为预设字符,即经过替换后,两个程序文件的非代码变量完全相同。然后,比较处理后的程序文件的文件内容是否相同,如果不相同,表明两个版本的程序文件的代码部分有差异,存储当前版本对应的该程序文件。利用该方法能够自动识别出两个版本的程序文件中代码部分有差异的文件,不需要人工挑选有修改的程序文件,大大提高了对比效率,且提高了对比准确率。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1示出了一种ELF文件的文件格式示意图;
图2示出了本发明实施例一种程序文件对比方法的流程示意图;
图3示出了本发明实施例另一种程序文件对比方法的流程示意图;
图4示出了本发明实施例一种程序文件对比装置的框图;
图5示出了本发明实施例一种第三获取模块的框图;
图6示出了本发明实施例另一种第三获取模块的框图;
图7示出了本发明实施例又一种第三获取模块的框图;
图8示出了本发明实施例一种比较模块的框图;
图9示出了本发明实施例另一种程序文件对比装置的框图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本申请针对ELF(Executable and Linking Format,可执行链接格式)格式的可执行程序文件进行对比,自动找到ELF文件中代码部分有修改的部分,无需配置管理员手工挑选。
ELF文件是一种对象文件的格式,用于定义不同类型的对象文件中放什么东西,以及,以哪种格式存放这些东西。ELF文件应用于Linux系统、Unix系统和Android系统中。
请参见图1,示出了一种ELF文件的文件格式,ELF文件从起始位置依次是ELF头部、程序头部表、n个节区,以及,节区头部表。
ELF头部,用于描述体系结构和操作系统等基本信息,并指出节区头部表和程序头部表在文件中的什么位置;
程序头部表,用于保存所有节区的描述信息;
节区,是用以装载内容数据的最小容器,在ELF文件中,每一个节区都装载了性质属性都一样的内容;
例如,.symtab节区用于装载用于定位和重定位程序中的符号定义和符号引用的信息,该节区包含一个符号表,在符号表内每一个符号设置一个条目。
.strtab节区用于装载字符串信息,该节区包含字符串表;该节区存储着以字符为分割符的字符串,这些字符串所表示的内容通常是程序中定义的函数名称、所定义过的变量名称等。当对象文件中其它地方需要和一个这样的字符串相关联时,往往会在对应的地方存储.strtab节区的索引值。字符串表在真正链接和生成进程映像过程中不使用,但调试程序时会使用。
.note节区用于装载注释信息,例如,公司的信息和发布版本号等信息。
节区头部表,包含用于描述这些节区的信息,例如,大小、偏移等。
发明人在实现本发明的过程中,通过对ELF文件格式分析后,发现同一份代码在不同时间编译后得到的两个ELF文件中有一些非代码部分的内容不一致。例如,包括程序文件的时间戳、符号调试信息等。本发明提供的程序文件对比方法就是将两个不同版本的可执行程序文件中的非代码部分替换为相同的内容,然后,再比较替换后的可执行程序文件,如果两个可执行程序文件仍有差异,则两个可执行程序文件的代码部分有差异。
下面将结合附图对本申请提供的程序文件对比方法进行详细介绍。
请参见图2,示出了本发明实施例一种程序文件对比方法的流程示意图,该方法应用于终端设备(例如,PC机)中,用于自动识别出两个版本的基于ELF文件的程序集中代码内容有差异的程序文件。如图2所示,该方法包括:
S110,分别从编译后的上次版本和当前版本对应的程序集中,获取文件名称相同的第一程序文件和第二程序文件。
根据上次版本代码编译后的程序集的路径,读取上次版本对应程序集中的程序文件;以及,根据当前版本代码编译后的程序集的路径,读取当前版本对应程序集中的程序文件。
然后,从上次版本对应程序集和当前版本对应程序集中读取文件名称相同的两个程序文件;把从上次版本对应程序集中读取的程序文件记为第一程序文件;把从当前版本对应程序集中读取的程序文件记为第二程序文件。
S120,通过结构体映射得到第一程序文件、第二程序文件的头部结构体;头部结构体包括ELF头部、程序头部表和节区头部表。
首先,通过结构体映射将ELF文件的头部映射出来,并从ELF文件的头部中找出ELF头部、程序头部表和节区头部表。
S130,根据第一程序文件的头部结构体,分别获取第一程序文件所包含的注释信息、符号调试信息及时间戳信息。
①注释信息可以包括公司信息和发布版本号等信息;注释信息是与程序代码部分无关的内容,即注释信息属于程序文件的非代码内容。其中,注释信息保存在.note节区中,.note节区的类型为SHT_NOTE。
在本发明一种可能的实现方式中,找到.note节区可以包括以下步骤:
查询节区头部表,获得类型为SHT_NOTE的节区的偏移量和结构体长度;然后,根据获得的偏移量和结构体长度,确定.note节区的位置,并读取该节区中的内容。
②符号调试信息包括调试路径、文件名称等信息,符号调试信息也是与程序代码本身无关的内容;符号调试信息保存在.debug节区中,.debug节区的类型为SHT_PROGBITS。
在本发明一种可能的实现方式中,找到.debug节区可以包括以下步骤:
查询节区头部表,获得类型为SHT_PROGBITS的节区的偏移量和结构体长度;然后,根据获得的偏移量和结构体长度,找到.debug节区,并读取.debug节区中的内容。
③时间戳是编译程序文件生成的时间信息,与程序代码本身无关的内容获取时间戳的过程可以包括以下步骤:
a.查询节区头部结构体,从类型为SHT_STRTAB的节区中找到.shstrtab结构体,并找到名称为.strtab和.symtab这2个字符串的数字id;
SHT_STRTAB是段表,该段表中包含.symtab和.strtab节区的起始位置和长度等信息。
程序文件可能包含多个字符串表节区,例如,可能包括.dynstr、.strtab、.shstrtab这3个属于SHT_STRTAB类型的节区,由于无法在一开始就定位到具体哪个SHT_STRTAB类型的节区是.shstrtab节区,所以遇到一个SHT_STRTAB类型的节区,遍历找到包含.symtab和.strtab的数据字典项。
节区头部结构体中存储的内容都需要根据索引(即,数字id)查找。
b.根据.strtab和.symtab这2个字符串的数字id从SHT_STRTAB结构体中找到节区名称为.symtab和.strtab的数据字典项,并分别记录下符号索引symindex和字符串索引strindex。
遍历所有节区的头部结构体,查找头部结构体中与.strtab的数字id匹配的数据字典项(即,头部结构内存储的具体内容);以及,查找头部结构体中与.symtab的数字id匹配的数据字典项。
其中,.symtab的数据字典项中存储的是符号索引symindex,该symindex是符号表的数字id;.strtab的数据字典项中存储的是字符串索引strindex,该strindex是字符串表的数字id。c.将所有节区的头部结构体加载到终端设备本地的节区头部结构体数组中;
d.遍历本地的节区头部结构体数组中的数字id,找到分别与symindex和strindex一致的项分别记录数组中下标。
具体的,根据symindex找到.symtab在本地节区头部结构体数组中的数组下标Aindex,其中,Aindex对应的内容是符号表的索引。
找到.strtab在本地节区头部结构体数组中的下标Bindex;
其中,Bindex是字符串表的索引。
e.根据Bindex从.strtab节区中查找节区名称为GetBizFunctionsInfo的节区对应的数字id;
这个GetBizFunctionsInfo节区是第三方编译工具在生成代码时写入的时间戳。
f.根据Aindex从.symtab节区中查找st_name(符号名字)字段值为GetBizFunctionsInfo对应数字id的结构体,获取其偏移量和结构体长度,这个结构体中存储的是时间戳的具体内容。
其中,st_name是符号表中的一个字段,符号的名字,但并不是一个字符串,而是字符串表中的一个索引值,在字符串表中该索引值的位置上存放的字符串就是该符号名字的实际文本;如果该值不为0,则它代表符号名字在字符串表中的索引值;如果该值为0,则表示该符号没有名字。
S140,将所述第一程序文件中的注释信息、符号调试信息及时间戳信息对应的内容替换为预设字符,得到第一待对比程序文件。
在本发明的一个实施例中,预设字符可以是“0”,当然,在本发明的其它实施例中,也可以是其他的字符。
S150,根据第二程序文件的头部结构体,获取第二程序文件所包含的注释信息、符号调试信息及时间戳信息。
第二程序文件的头部结构体的过程与第一程序文件的头部结构体获取过程相同,此处不再赘述。
S160,将第二程序文件中的注释信息、符号调试信息及时间戳信息对应的内容替换为所述预设字符,得到第二待对比程序文件。
S170,比较第一待对比程序文件和第二待对比程序文件的文件内容是否相同;如果不相同,则执行S180;如果相同,则执行S190。
比较处理后的两个程序文件的文件内容是否完全相同,可以采用MD5校验方式;将处理后的第一程序文件(即,第一待对比程序文件)的文件内容生成第一MD5码,以及,将处理后的第二程序文件(即,第二待对比程序文件)的文件内容生成第二MD5码,然后,比较第一MD5码和第二MD5码,如果两个MD5码相同,则两个程序文件的文件内容相同;如果两个MD5码不相同,则两个程序文件的文件内容不完全相同。
如果比较得到两个文件的文件内容相同,则确定两个文件的代码部分内容相同,则继续判断程序集中的下一个程序文件。
S180,确定第一程序文件与第二程序文件的代码内容不相同。
S190,确定第一程序文件与第二程序文件的代码内容相同。
本实施例提供的程序文件对比方法,在比较上次版本和当前版本对应的程序集文件之前,首先,获取两个版本的程序集中文件名称相同的程序文件,分别获取两个程序文件中的注释信息、符号调试信息和时间戳信息,并将两个程序文件中的这三项信息都替换为预设字符,即经过替换后,两个程序文件的非代码变量完全相同。然后,比较处理后的程序文件的文件内容是否相同,如果不相同,表明两个版本的程序文件的代码部分有差异,存储当前版本对应的该程序文件。利用该方法能够自动识别出两个版本的程序文件中代码部分有差异的文件,不需要人工挑选有修改的程序文件,大大提高了对比效率,且提高了对比准确率。
请参见图3,为本发明实施例另一种程序文件对比方法的流程示意图,在图2所示实施例的基础上还包括以下步骤:
S210,记录比较得到的文件内容不相同的文件名称。
存储步骤S170中比较得到文件内容不相同的程序文件对应的文件名称。
S220,从当前版本的程序集中获取所述文件名称对应的程序文件。
依据该文件名称对应的文件路径复制该文件名称对应的程序文件到输出目录,该输出目录中的程序文件用于得到程序增量包。
S230,将所述程序文件复制到输出目录中,直到比较完上次版本和当前版本的程序集中的所有程序文件后,得到程序增量包。
比较完程序集中的所有程序文件后,输出目录中包含两个版本的程序集中文件内容不相同的全部程序文件,即从当前版本的程序集中挑选出与上次版本不相同的程序文件,即得到程序增量包。
本实施例提供的程序文件对比方法能够自动识别出两个版本的程序文件中文件内容有差异的程序文件,自动输出有差异的程序文件集合(即,程序增量包),不需要人工挑选有修改的程序文件,大大提高了对比效率,且提高了对比准确率。
对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本发明所必须的。
相应于上述的程序文件对比方法实施例,本发明还提供了程序文件对比装置实施例。
请参见图4,示出了本发明实施例一种程序文件对比装置的框图,该装置应用于基于可执行链接格式ELF文件的程序集中。
如图4所示,该装置包括:第一获取模块110、第二获取模块120、第三获取模块130、替换模块140和比较模块150。
第一获取模块110,用于分别从编译后的上次版本和当前版本的程序集中,获取文件名称相同的第一程序文件和第二程序文件。
第二获取模块120,用于获取所述第一程序文件和所述第二程序文件的头部结构体,所述头部结构体包括ELF头部、程序头部表和节区头部表;
第三获取模块130,用于根据所述第一程序文件的头部结构体,分别获取所述第一程序文件所包含的注释信息、符号调试信息及时间戳信息,以及,根据所述第二程序文件的头部结构体获取所述第二程序文件所包含的注释信息、符号调试信息及时间戳信息。
(1)当第三获取模块用于获取所述第一程序文件所包含的注释信息时,如图5所示,第三获取模块130包括:第一获取子模块1311和第二获取子模块1312。
第一获取子模块1311,用于查询所述节区头部表,获得类型为SHT_NOTE的节区的偏移量和结构体长度。
第二获取子模块1312,用于根据所述类型为SHT_NOTE的节区的偏移量和结构体长度,获得.note节区,所述.note节区用于保存所述注释信息。
(2)当所述第三获取模块用于获取所述第一程序文件所包含的符号调试信息时,如图6所示,该第三获取模块130包括:
第三获取子模块1321,用于查询所述节区头部表,获得类型为SHT_PROGBITS的节区的偏移量和结构体长度;
第四获取子模块1322,用于根据所述类型为SHT_PROGBITS的节区的偏移量和结构体长度,获得.debug节区,所述.debug节区用于保存所述符号调试信息。
(3)当所述第三获取模块用于获取所述第一程序文件所包含的时间戳信息时,如图7所示,该第三获取模块130包括:
第五获取子模块1331,用于查询所述节区头部表,获得类型为SHT_STRTAB的节区,查找.shstrtab结构体,并找到名称为.strtab和.symtab这2个字符串的数字id;
第六获取子模块1332,用于遍历SHT_STRTAB节区,根据.strtab的数字id获得字符串索引.strindex;根据.symtab的数字id获得符号索引symindex;
第一查找子模块1333,用于遍历终端设备本地的节区头部结构体数组中的数字id,查找与所述.strindex匹配的项所对应的数组下标Bindex,以及查找与所述symindex匹配的项所对应的数组下标Aindex;
第二查找子模块1334,用于根据Bindex从strtab节区中查找节区名称为GetBizFunctionsInfo的节区对应的数字id;
第三查找子模块1335,用于根据Aindex从.symtab节区中查找st_name(符号名字)字段值为GetBizFunctionsInfo对应数字id的结构体,获取存储时间戳的结构体对应的偏移量和结构体长度,并根据所述偏移量和结构长度获得所述时间戳。
替换模块140,用于分别将所述第一程序文件中的注释信息、符号调试信息及时间戳信息对应的内容替换为预设字符,得到第一待对比程序文件,以及,将所述第二程序文件中的注释信息、符号调试信息及时间戳信息对应的内容替换为所述预设字符,得到第二待对比程序文件。
比较模块150,用于比较所述第一待对比程序文件和所述第二待对比程序文件的文件内容是否相同,如果不相同,则确定所述第一程序文件与所述第二程序文件的代码内容不相同。
在本发明一种可能的实现方式中,如图8所示,该比较模块150包括:第一校验码获取子模块151、第二校验码获取子模块152和比较子模块153。
第一校验码获取子模块151,用于对第一待对比程序文件进行MD5校验,得到第一MD5校验码。
第二校验码获取子模块152,用于对第二待对比程序文件进行MD5校验,得到第二MD5校验码。
比较子模块153,用于比较所述第一MD5校验码与所述第二MD5校验码是否相同;如果相同,则确定所述第一程序文件与所述第二程序文件的文件内容相同;如果不相同,则确定所述第一程序文件与所述第二程序文件的文件内容不相同。
本实施例提供的程序文件对比装置,在比较上次版本和当前版本对应的程序集文件之前,首先,获取两个版本的程序集中文件名称相同的程序文件,分别获取两个程序文件中的注释信息、符号调试信息和时间戳信息,并将两个程序文件中的这三项信息都替换为预设字符,即经过替换后,两个程序文件的非代码变量完全相同。然后,比较处理后的程序文件的文件内容是否相同,如果不相同,表明两个版本的程序文件的代码部分有差异,存储当前版本对应的该程序文件。利用该装置能够自动识别出两个版本的程序文件中代码部分有差异的文件,不需要人工挑选有修改的程序文件,大大提高了对比效率,且提高了对比准确率。
请参见图9,示出了本发明实施例另一种程序文件对比装置的框图,如图9所示,该装置在图4所示实施例的基础上还包括:记录模块210、第四获取模块220和第五获取模块230。
记录模块210,用于记录代码内容不相同的程序文件的文件名称。
第四获取模块220,用于从当前版本的程序集中获取所述文件名称对应的程序文件。
第五获取模块230,用于将所述程序文件复制到输出目录中,直到比较完上次版本和当前版本的程序集中的所有程序文件后,得到程序增量包。
根据记录模块210得到的文件名称对应的文件路径复制该文件名称对应的程序文件到输出目录,该输出目录中的程序文件用于得到程序增量包。
比较完程序集中的所有程序文件后,输出目录中包含两个版本的程序集中文件内容不相同的全部程序文件,即从当前版本的程序集中挑选出与上次版本不相同的程序文件,即得到程序增量包。
本实施例提供的程序文件对比装置能够自动识别出两个版本的程序文件中文件内容有差异的程序文件,自动输出有差异的程序文件集合(即,程序增量包),不需要人工挑选有修改的程序文件,大大提高了对比效率,且提高了对比准确率。
需要说明的是,本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。对于装置类实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
对所公开的实施例的上述说明,使本领域技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

Claims (12)

1.一种程序文件对比方法,其特征在于,应用于基于可执行链接格式ELF文件的程序集中,该方法包括:
分别从编译后的上次版本和当前版本的程序集中,获取文件名称相同的第一程序文件和第二程序文件;
获得所述第一程序文件和所述第二程序文件的头部结构体,所述头部结构体包括ELF头部、程序头部表和节区头部表;
根据所述第一程序文件的头部结构体,分别获取所述第一程序文件所包含的注释信息、符号调试信息及时间戳信息,以及,根据所述第二程序文件的头部结构体获取所述第二程序文件所包含的注释信息、符号调试信息及时间戳信息;
分别将所述第一程序文件中的注释信息、符号调试信息及时间戳信息对应的内容替换为预设字符,得到第一待对比程序文件,以及,将所述第二程序文件中的注释信息、符号调试信息及时间戳信息对应的内容替换为所述预设字符,得到第二待对比程序文件;
比较所述第一待对比程序文件和所述第二待对比程序文件的文件内容是否相同,如果不相同,则确定所述第一程序文件与所述第二程序文件的代码内容不相同。
2.根据权利要求1所述的方法,其特征在于,所述获取所述第一程序文件所包含的注释信息,包括:
查询所述节区头部表,获得类型为SHT_NOTE的节区的偏移量和结构体长度;
根据所述类型为SHT_NOTE的节区的偏移量和结构体长度,获得.note节区,所述.note节区用于保存所述注释信息。
3.根据权利要求1所述的方法,其特征在于,获取所述第一程序文件所包含的符号调试信息,包括:
查询所述节区头部表,获得类型为SHT_PROGBITS的节区的偏移量和结构体长度;
根据所述类型为SHT_PROGBITS的节区的偏移量和结构体长度,获得.debug节区,所述.debug节区用于保存所述符号调试信息。
4.根据权利要求1所述的方法,其特征在于,获取所述第一程序文件所包含的时间戳信息,包括:
查询所述节区头部表,获得类型为SHT_STRTAB的节区,查找.shstrtab结构体,并找到节区名称.strtab对应的数字id,以及节区名称.symtab对应的数字id;
遍历SHT_STRTAB节区,根据所述.strtab对应的数字id获得字符串索引strindex;根据所述.symtab对应的数字id获得符号索引symindex;
遍历终端设备本地的节区头部结构体数组中的数字id,查找与所述strindex匹配的项所对应的数组下标Bindex,以及查找与所述symindex匹配的项所对应的数组下标Aindex;
根据所述Bindex从.strtab节区中查找节区名称为GetBizFunctionsInfo的节区对应的数字id;
根据所述Aindex从.symtab节区中查找st_name字段值为GetBizFunctionsInfo对应数字id的结构体,获取存储时间戳的结构体的偏移量和结构体长度,并根据所述偏移量和结构体长度获得时间戳。
5.根据权利要求1-4任一项所述的方法,其特征在于,所述比较所述第一待对比程序文件和所述第二待对比程序文件的文件内容是否相同,包括:
对所述第一待对比程序文件进行MD5校验,得到第一MD5校验码;
对所述第二待对比程序文件进行MD5校验,得到第二MD5校验码;
比较所述第一MD5校验码与所述第二MD5校验码是否相同;如果相同,则确定所述第一程序文件与所述第二程序文件的文件内容相同;如果不相同,则确定所述第一程序文件与所述第二程序文件的文件内容不相同。
6.根据权利要求1所述的方法,其特征在于,所述方法还包括:
记录代码内容不相同的程序文件的文件名称;
从当前版本的程序集中获取所述文件名称对应的程序文件;
将所述程序文件复制到输出目录中,直到比较完上次版本和当前版本的程序集中的所有程序文件后,得到程序增量包。
7.一种程序文件对比装置,其特征在于,应用于基于可执行链接格式ELF文件的程序集中,该装置包括:
第一获取模块,用于分别从编译后的上次版本和当前版本的程序集中,获取文件名称相同的第一程序文件和第二程序文件;
第二获取模块,用于通过结构体映射得到所述第一程序文件和所述第二程序文件的头部结构体,所述头部结构体包括ELF头部、程序头部表和节区头部表;
第三获取模块,用于根据所述第一程序文件的头部结构体,分别获取所述第一程序文件所包含的注释信息、符号调试信息及时间戳信息,以及,根据所述第二程序文件的头部结构体获取所述第二程序文件所包含的注释信息、符号调试信息及时间戳信息;
替换模块,用于分别将所述第一程序文件中的注释信息、符号调试信息及时间戳信息对应的内容替换为预设字符,得到第一待对比程序文件,以及,将所述第二程序文件中的注释信息、符号调试信息及时间戳信息对应的内容替换为所述预设字符,得到第二待对比程序文件;
比较模块,用于比较所述第一待对比程序文件和所述第二待对比程序文件的文件内容是否相同,如果不相同,则确定所述第一程序文件与所述第二程序文件的代码内容不相同。
8.根据权利要求7所述的装置,其特征在于,所述第三获取模块用于获取所述第一程序文件所包含的注释信息时,包括:
第一获取子模块,用于查询所述节区头部表,获得类型为SHT_NOTE的节区的偏移量和结构体长度;
第二获取子模块,用于根据所述类型为SHT_NOTE的节区的偏移量和结构体长度,获得.note节区,所述.note节区用于保存所述注释信息。
9.根据权利要求7所述的装置,其特征在于,所述第三获取模块用于获取所述第一程序文件所包含的符号调试信息时,包括:
第三获取子模块,用于查询所述节区头部表,获得类型为SHT_PROGBITS的节区的偏移量和结构体长度;
第四获取子模块,用于根据所述类型为SHT_PROGBITS的节区的偏移量和结构体长度,获得.debug节区,所述.debug节区用于保存所述符号调试信息。
10.根据权利要求7所述的装置,其特征在于,所述第三获取模块用于获取所述第一程序文件所包含的时间戳信息时,包括:
第五获取子模块,用于查询所述节区头部表,获得类型为SHT_STRTAB的节区,查找.shstrtab结构体,并找到节区名称.strtab对应的数字id,以及节区名称.symtab对应的数字id;
第六获取子模块,用于遍历SHT_STRTAB节区,根据所述.strtab对应的数字id获得字符串索引strindex;根据所述.symtab对应的数字id获得符号索引symindex;
第一查找子模块,用于遍历终端设备本地的节区头部结构体数组中的数字id,查找与所述strindex匹配的项所对应的数组下标Bindex,以及查找与所述symindex匹配的项所对应的数组下标Aindex;
第二查找子模块,用于根据所述Bindex从.strtab节区中查找节区名称为GetBizFunctionsInfo的节区对应的数字id;
第三查找子模块,用于根据所述Aindex从.symtab节区中查找st_name字段值为GetBizFunctionsInfo对应数字id的结构体,获取存储时间戳的结构体对应的偏移量和结构体长度,并根据所述偏移量和结构长度获得所述时间戳。
11.根据权利要求7-10任一项所述的装置,其特征在于,所述比较模块,包括:
第一校验码获取子模块,用于对所述第一待对比程序文件进行MD5校验,得到第一MD5校验码;
第二校验码获取子模块,用于对所述第二待对比程序文件进行MD5校验,得到第二MD5校验码;
比较子模块,用于比较所述第一MD5校验码与所述第二MD5校验码是否相同;如果相同,则确定所述第一程序文件与所述第二程序文件的文件内容相同;如果不相同,则确定所述第一程序文件与所述第二程序文件的文件内容不相同。
12.根据权利要求11所述的装置,其特征在于,所述装置还包括:
记录模块,用于记录代码内容不相同的程序文件的文件名称;
第四获取模块,用于从当前版本的程序集中获取所述文件名称对应的程序文件;
第五获取模块,用于将所述程序文件复制到输出目录中,直到比较完上次版本和当前版本的程序集中的所有程序文件后,得到程序增量包。
CN201611111304.0A 2016-12-06 2016-12-06 一种程序文件对比方法及装置 Active CN106547573B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201611111304.0A CN106547573B (zh) 2016-12-06 2016-12-06 一种程序文件对比方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201611111304.0A CN106547573B (zh) 2016-12-06 2016-12-06 一种程序文件对比方法及装置

Publications (2)

Publication Number Publication Date
CN106547573A CN106547573A (zh) 2017-03-29
CN106547573B true CN106547573B (zh) 2020-01-31

Family

ID=58397060

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201611111304.0A Active CN106547573B (zh) 2016-12-06 2016-12-06 一种程序文件对比方法及装置

Country Status (1)

Country Link
CN (1) CN106547573B (zh)

Families Citing this family (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108052344A (zh) * 2017-12-11 2018-05-18 北京奇虎科技有限公司 一种内核差异检测方法及装置
CN112860284B (zh) * 2019-11-12 2024-05-10 深圳怡化电脑股份有限公司 设备远程升级的sp升级包生成方法、装置及计算机设备
CN112181479A (zh) * 2020-09-23 2021-01-05 中国建设银行股份有限公司 代码文件版本间差异的确定方法、装置及电子设备
CN114265634A (zh) * 2021-12-22 2022-04-01 中国农业银行股份有限公司 基于集中式版本控制系统的文件提交方法和装置
CN115357286B (zh) * 2022-08-03 2023-11-10 中信建投证券股份有限公司 一种程序文件对比方法、装置、电子设备及存储介质

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8555245B2 (en) * 2010-02-05 2013-10-08 International Business Machines Corporation Automated application generation method and system
CN103713928A (zh) * 2013-12-31 2014-04-09 优视科技有限公司 增量文件生成方法、应用程序安装文件更新方法及装置
CN103973475A (zh) * 2013-02-05 2014-08-06 腾讯科技(深圳)有限公司 差异补丁包生成方法及下载方法、服务器、客户端

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8555245B2 (en) * 2010-02-05 2013-10-08 International Business Machines Corporation Automated application generation method and system
CN103973475A (zh) * 2013-02-05 2014-08-06 腾讯科技(深圳)有限公司 差异补丁包生成方法及下载方法、服务器、客户端
CN103713928A (zh) * 2013-12-31 2014-04-09 优视科技有限公司 增量文件生成方法、应用程序安装文件更新方法及装置

Also Published As

Publication number Publication date
CN106547573A (zh) 2017-03-29

Similar Documents

Publication Publication Date Title
CN106547573B (zh) 一种程序文件对比方法及装置
CN106547572B (zh) 一种程序文件对比方法及装置
US8972372B2 (en) Searching code by specifying its behavior
US8387003B2 (en) Pluperfect hashing
CN108628751A (zh) 一种无用依赖项检测方法及装置
US20050165724A1 (en) System and method for using an XML file to control XML to entity/relationship transformation
CN103870588A (zh) 一种在数据库中使用的方法及装置
CN103257971B (zh) 终端和文件管理方法
CN111506342A (zh) 版本差异检测方法、装置、电子设备及存储介质
CN114780109B (zh) Python项目第三方库依赖自动化解析与安装方法
CN112860312A (zh) 项目依赖关系变化的检测方法及装置
CN113515303B (zh) 一种项目转型方法、装置和设备
Levine et al. DEX: Digital evidence provenance supporting reproducibility and comparison
US20040098670A1 (en) Processing of data
CN111859864A (zh) 一种将库数据转化为流式文档方法及转换工具
CN114048352B (zh) Xml文件转换不定长结构体的方法
CN112115125B (zh) 数据库访问对象名称解析方法、装置及电子设备
Le Zou et al. On synchronizing with web service evolution
CN110297651B (zh) 协议接口的常用变量的更新方法和装置
US6578195B1 (en) Process for data encapsulation in large scale legacy software
CN113177391A (zh) 在流式界面中操作光标重定向方法、计算设备及存储介质
US20100042599A1 (en) Adding low-latency updateable metadata to a text index
CN116954701B (zh) 一种基于血缘关系的二进制组件检测方法及系统
US7149758B2 (en) Data processing apparatus, data processing method, and data processing program
CN117707985B (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