CN104063220B - 基于文件的Linux基础软件依赖关系分析方法 - Google Patents

基于文件的Linux基础软件依赖关系分析方法 Download PDF

Info

Publication number
CN104063220B
CN104063220B CN201410291217.2A CN201410291217A CN104063220B CN 104063220 B CN104063220 B CN 104063220B CN 201410291217 A CN201410291217 A CN 201410291217A CN 104063220 B CN104063220 B CN 104063220B
Authority
CN
China
Prior art keywords
dependence
binary
counter
binary file
elements
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
CN201410291217.2A
Other languages
English (en)
Other versions
CN104063220A (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.)
Tsinghua University
Original Assignee
Tsinghua University
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 Tsinghua University filed Critical Tsinghua University
Priority to CN201410291217.2A priority Critical patent/CN104063220B/zh
Publication of CN104063220A publication Critical patent/CN104063220A/zh
Application granted granted Critical
Publication of CN104063220B publication Critical patent/CN104063220B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Landscapes

  • Stored Programmes (AREA)

Abstract

提供了Linux基础软件依赖关系分析方法,可以包括:扫描一个Linux系统,得到所有二进制可执行文件和库文件的列表;获得该列表中的文件之间的依赖关系;消除二进制文件的循环依赖关系,构建集合{X},其中集合{X}由彼此之间不存在循环依赖关系的元素组成,元素X为由处于一个循环依赖链上的所有文件构成的集合或者由不存在于任何一个循环依赖链中的单个文件构成的集合;对集合{X}中的每个元素,依据文件之间的依赖关系,建立元素之间的依赖关系。本发明实施例的Linux基础软件依赖关系分析方法,可以在无需软件包描述信息的情况下,直接获得Linux系统中内核之上的所有软件的二进制可执行文件和库文件之间的依赖关系。

Description

基于文件的Linux基础软件依赖关系分析方法
技术领域
本发明总体地涉及Linux系统,更具体地涉及Linux基础软件依赖关系分析方法。
背景技术
一个典型的Linux系统中包含数以千计的软件包,数以万计的可执行文件,如果每个软件的功能实现都从Linux最底层的系统调用开始构建,软件的设计会异常复杂、工作量很大,因此实际的Linux软件系统中都包含各种面向不同目标的软件库。Linux系统中这些软件包的二进制可执行文件与库文件之间存在互相依赖关系,不同的软件由不同的开发者或开发团队进行开发,为了使得软件开发更加高效,软件的开发者会根据自己的知识和软件开发效率的考虑,使得一些软件的功能可以通过调用其他软件库的API调用来实现,从而让整个Linux系统的软件呈现出一种复杂的积木式结构,即每个软件功能都不是很大,但通过复杂的组合形成一个较为复杂、较为完备的应用系统。
传统的Linux系统采用包管理的方式来组织管理Linux系统中复杂的软件结构,每个软件包中都包含一个描述文件来表述该软件包依赖哪些其他软件包,比如RPM包管理系统等,这样的设计使得Linux系统的使用和管理较为方便。不过包管理系统中的软件包依赖关系描述文件是由富有经验的Linux系统开发人员手工指定的,不能自动化的生成软件的依赖关系图,也不能用于Linux系统开发的结构分析和Linux系统的安全性分析。。
发明内容
鉴于现有技术的以上情况,提出了本发明。
根据本发明的一个方面,提出了一种用于分析Linux基础软件之间的依赖关系的Linux基础软件依赖关系分析方法,可以包括:
步骤1:扫描一个Linux系统,得到所有二进制可执行文件和库文件的列表;
步骤2:获得该列表中的文件之间的依赖关系;
步骤3:消除二进制文件的循环依赖关系,构建集合{X},其中集合{X}由彼此之间不存在循环依赖关系的元素组成,元素X为由处于一个循环依赖链上的所有文件构成的集合或者由不存在于任何一个循环依赖链中的单个文件构成的集合;
步骤4:对集合{X}中的每个元素,依据步骤2获得的文件之间的依赖关系,建立元素之间的依赖关系,如果一个元素中存在多个文件与另一个元素中的多个文件存在依赖关系,两个元素之间只记为一个依赖关系,集合{X}中各元素的依赖关系是一个内部不存在循环依赖的树状依赖关系图。
利用本发明实施例的Linux基础软件依赖关系分析方法,可以在无需软件包描述信息的情况下,直接获得Linux系统中内核之上的所有软件的二进制可执行文件和库文件之间的依赖关系。
根据本发明的另一方面,提供了一种用于分析Linux基础软件之间的依赖关系的Linux基础软件依赖关系分析方法,可以包括:
步骤1:扫描一个Linux系统中,得到所有二进制可执行文件和库文件的列表;
步骤2:逐个分析每个二进制可执行文件和库文件的函数调用关系,获得该文件所依赖的其他二进制可执行文件和库文件的集合;
步骤3:对上述集合中的每个被依赖的二进制文件,建立一个从被分析的二进制文件到集合中被依赖的该二进制文件的有向依赖连接;
步骤4:检查Linux系统中的所有二进制文件是否都被分析过,如果还有没有被分析的二进制文件,回到步骤2;否则进入步骤5;
步骤5:查找系统二进制文件的循环依赖关系,对于找到的每个循环依赖关系,处于循环依赖链上的所有文件构成一个集合,记为集合Xi,i=0...M-1,M表示整个系统中没有重叠的循环依赖链个数;其他不存在于任何一个循环依赖链中的文件被记为只有一个元素的集合Xj,j=M...M+N-1,N表示系统中不在任何一个循环依赖链中的文件个数;由所有的Xi和Xj构成一个新的集合{X},该集合的大小为N+M;
步骤6:对集合{X}中的每个元素,依据步骤2到步骤4获得的文件之间的依赖关系,建立元素之间的依赖关系,如果一个元素中存在多个文件与另一个元素中的多个文件存在依赖关系,两个元素之间只记为一个依赖关系,集合{X}中各元素的依赖关系是一个内部不存在循环依赖的树状依赖关系图;
步骤7:初始化集合{X}中每个元素对应的计数器A和计数器B值均为0。计数器A的值表示该二进制文件被其他文件依赖的次数,计数器B的值表示该二进制文件一共依赖多少个其他二进制文件;
步骤8:逐个处理集合{X}中的每个元素,如果该元素依赖其他某个元素,则被依赖的元素(即所述的其他某个元素)所对应的计数器A执行加一操作,该元素对应的计数器B值等于该元素依赖的其他元素的总个数;
步骤9:集合{X}中是否存在未被处理的元素,如果还有则返回步骤8;否则进入步骤10;
步骤10:此时集合{X}中每个元素对应的计数器A值表示该元素总计被多少个其他元素依赖,计数器B值表示该元素依赖多少个其他元素,对集合{X}中的所有元素,按对应的计数器A值从小到大进行排序,计数器A的值大表示该元素的重要程度;
步骤11:初始化一个集合{Y}为空,并为每个元素设置计数器C,计数器C值初始化为0;
步骤12:找到集合{X}中计数器A值为0的元素D,即不被其他任何集合{X}中的元素依赖的元素,如果存在多个计算器A值为0的元素,任选其中1个进行处理;
步骤13:对于步骤12中找到的每个元素D,找到集合{Y}中哪些元素依赖元素D,计算这些元素的计数器C值之和Ve与这些元素的总个数Vf,设置则该元素的计数器C值为Ve+Vf,然后将该元素从集合{X}中删除,并将该元素加入集合{Y},再在集合{X}中找到被元素D依赖的所有元素,将这些元素的计数器A值减1;
步骤14:检查集合{X}中是否为空,如不为空回到步骤12,否则进入步骤15;以及
步骤15:存储结合{Y}作为Linux基础软件依赖关系分析的结果,集合{Y}中包含了所有的元素,包括单个文件元素,也包括存在文件循环依赖关系的封闭依赖链元素组成的集合元素,集合{Y}中的每个元素计数器C值代表了该元素被其他元素直接依赖和间接依赖的总次数,该值更能反映单个元素在整个Linux系统中的重要程度,被直接依赖和间接依赖总次数越多的元素,其重要性越强。
利用本发明实施例的Linux基础软件依赖关系分析方法,可以在无需软件包描述信息的情况下,直接扫描Linux文件系统中所有的二进制文件(包括可执行文件和库文件),从而直接获得Linux系统中内核之上的所有软件的二进制可执行文件和库文件之间的依赖关系,并给出所有二进制文件在整个Linux系统中的重要程度量化评价指标,可以为Linux系统安全性分析、Linux系统结构分析提供有力支持。
附图说明
从下面结合附图对本发明实施例的详细描述中,本发明的这些和/或其它方面和优点将变得更加清楚并更容易理解,其中:
图1示出了根据本发明第一实施例的用于分析Linux基础软件之间的依赖关系的Linux基础软件依赖关系分析方法100的总体流程图。
图2示出了执行ldd命令的执行结果示意图。
图3示出了执行该readelf相关命令的执行结果示意图。
图4示出了根据本发明一个实施例的消除二进制文件的循环依赖关系的示例性方法130的流程图。
图5示出了根据本发明第二实施例的Linux基础软件依赖关系分析方法200的总体流程图。
图6示出了根据本发明一个实施例的对于集合{X}中的每个元素,计算该元素被其他元素直接依赖和间接依赖的总次数的示例性方法250的流程图。
图7示出了根据本发明另一个实施例的对于集合{X}中的每个元素,计算该元素被其他元素直接依赖和间接依赖的总次数的示例性方法250’的流程图。
图8示出了根据本发明第三实施例的Linux基础软件依赖关系分析装置300的配置框图。
具体实施方式
为了使本领域技术人员更好地理解本发明,下面结合附图和具体实施方式对本发明作进一步详细说明。
在本文中,术语“二进制文件”是二进制可执行文件和二进制库文件的统称。
在本文中,除非特别说明或者和其他修饰词结合出现或者根据上下文明显为其他含义,否则单独出现的词汇“文件”指代二进制文件。
在本文中,“没有重叠的依赖循环链”表示任意两个循环依赖链上的文件集合没有交集。
一、第一实施例
图1示出了根据本发明第一实施例的用于分析Linux基础软件之间的依赖关系的Linux基础软件依赖关系分析方法100的总体流程图。
在步骤S110中,扫描一个Linux系统,得到所有二进制可执行文件和库文件的列表,然后前进到步骤S120。
在步骤S120中,获得该列表中的文件之间的依赖关系。这里的文件之间的依赖关系指的是文件之间存在直接依赖关系,即直接的调用和被调用关系。
在一个示例中,获得文件之间的依赖关系可以包括:
步骤1:对列表中的每个二进制可执行文件和库文件,分析该文件与其他文件之间的函数调用关系,获得该文件所依赖的其他二进制可执行文件和库文件的集合;以及
步骤2:对上述集合中的每个被依赖的二进制文件,建立一个从被分析的二进制文件到集合中被依赖的该二进制文件的有向依赖连接。
下面给出得到二进制文件之间的函数调用依赖关系,从而确定两个二进制文件之间的依赖关系的示例性方法。
例如,二进制文件之间的依赖关系可以用如下两种方法获得:
1)方法1:利用ldd命令分析库调用的依赖关系。
通过执行“ldd待分析的二进制文件全路径名”命令,可以获得该文件依赖哪些二进制库文件。比如执行如下命令:
ldd/usr/bin/as
可以获得as文件依赖libc.so.6等二进制文件,图2给出了执行ldd命令的执行结果示意图。
2)方法2:利用readelf工具分析可执行文件/库的依赖性。
通过执行“readelf-dynamic待分析的二进制文件全路径名”命令,可以获得该文件依赖哪些二进制库文件。比如执行如下命令:
readelf–dynamic/usr/bin/as
可以获得as文件依赖libc.so.6等二进制文件,图3给出了执行该readelf相关命令的执行结果示意图。
通过例如以上两种方法的任一个或者其组合,可以逐个处理Linux系统中每个有待分析的二进制可执行文件或二进制库文件,从而获得所有待分析的二进制文件之间的依赖关系。
在步骤S120中获得该列表中的文件之间的依赖关系之后,前进到步骤S130。
在步骤S130中,消除二进制文件的循环依赖关系,构建集合{X},其中集合{X}由彼此之间不存在循环依赖关系的元素组成,元素X为由处于一个循环依赖链上的所有文件构成的集合或者由不存在于任何一个循环依赖链中的单个文件构成的集合。
下面参考图4描述根据本发明一个实施例的消除二进制文件的循环依赖关系的示例性方法130的过程。
在步骤S131中,查找系统二进制文件的循环依赖关系,然后前进到步骤S132。
下面详细描述查找系统二进制文件的循环依赖关系的一个示例性方法。
由于Linux系统是一个复杂的积木式软件系统,经过长期的演化和发展,一些软件之间可能存在互相依赖关系,比如二进制文件A依赖二进制文件B,同时二进制文件B又依赖二进制文件A。再比如二进制文件A依赖二进制文件B,二进制文件B依赖二进制文件C,而二进制文件C又依赖二进制文件A,从而构成一个环形的循环依赖关系。上述环形的循环依赖关系仅为示例,可以存在其他形式的或者更复杂的循环依赖关系。
以上循环依赖关系可能导致图1中的步骤4及可选的其后的步骤形成无限循环操作,导致处理流程死锁。为避免该问题,需要将所有存在循环依赖关系的相关二进制文件合并成一个文件集合,在新的集合中被视为一个元素,从而让所有元素呈现为一种单向的树状依赖图。
作为示例,可以利用下述方法来遍历查找出Linux系统中的所有二进制文件循环依赖关系:
步骤1:将系统中的所有二进制文件加入集合{S},以及初始化一个集合{C}为空,用于记录后续步骤中发现的循环依赖文件集合。
步骤2:从集合{S}中随机选取一个文件T,并将该文件T从集合{S}中删除。将该二进制文件T加入集合{P},初始情况下集合P只包含该文件T本身一个元素。
步骤3:利用深度优先搜索算法搜索文件X依赖的所有二进制文件,每执行一步深度搜索,将相应的二进制文件加入集合{P},如果新加入集合{P}的二进制文件为T,则表示该深度优先搜索路径构成了一个二进制文件循环依赖,跳至步骤5;否则继续深度优先搜索,直到没有进一步依赖的二进制文件时该条深度优先搜索路径结束,再递归进入下一条深度优先搜索路径,从集合{P}中删除递归之前的相关文件。
步骤4:将文件T从集合{S}中删除,跳转至步骤8。
步骤5:将集合{P}中的所有仍在集合{S}中的二进制文件从集合{S}中删除。
步骤6:检查集合{P}与集合{C}中已有的元素是否存在重叠,如果有重叠,则合并两个集合,删除集合{C}中原有与集合{P}存在重叠的元素,将合并后的集合做为一个新的元素重新放入集合{C},跳至步骤7。
步骤7:如集合{P}与集合{C}中已有的元素不存重叠,则将集合{P}做为一个新元素放入集合{C}。
步骤8:清空集合{P}。
步骤9:判断集合{S}是否为空,如为空,则结束处理;如果集合{S}不为空,即表示还有尚未分析的二进制文件,则回到步骤2。
经过上述步骤的遍历搜索,集合{C}中的元素个数即为系统中存在的不互相交叉的循环依赖关系的个数,集合{C}中的每个元素为存在循环依赖关系的若干个二进制文件的集合,可用于图1中的步骤S130中集合{X}的构建。
在步骤S131中查找系统二进制文件的循环依赖关系之后前进到步骤S132。
在步骤S132中,对于找到的每个循环依赖关系,由处于循环依赖链上的所有文件构成一个集合,记为集合Xi,i=0...M-1,其中M表示整个系统中没有重叠的循环依赖链个数,M为大于等于1的正整数。然后,前进到步骤S132。
在步骤133中,将其他不存在于任何一个循环依赖链中的文件记为只有一个元素的集合Xj,j=M...M+N-1,N表示系统中不在任何一个循环依赖链中的文件个数,N为大于等于1的正整数。然后,前进到步骤S134。
在步骤S134中,由所有的Xi和Xj构成所述集合{X},该集合{X}的大小为N+M。
返回到图1,在步骤S130中消除二进制文件的循环依赖关系并构建集合{X}之后,前进到步骤S140。
在步骤S140中,对集合{X}中的每个元素,依据步骤S120获得的文件之间的依赖关系,建立元素之间的依赖关系,其中如果一个元素中存在多个文件与另一个元素中的多个文件存在依赖关系,两个元素之间只记为一个依赖关系,集合{X}中各元素的依赖关系是一个内部不存在循环依赖的树状依赖关系图。
不同于常见及的基于软件包信息的软件包依赖关系分析方法,利用结合图1描述的本发明实施例的Linux基础软件依赖关系分析方法,在无需软件包描述信息的情况下,直接扫描Linux文件系统中所有的二进制文件(包括可执行文件和库文件),从而能够直接获得Linux系统中内核之上的所有软件的二进制可执行文件和库文件之间的依赖关系,可以为Linux系统安全性分析、Linux系统结构分析提供有力支持。
二、第二实施例
图5示出了根据本发明第二实施例的Linux基础软件依赖关系分析方法200的总体流程图。
相比于结合图1描述的根据本发明第一实施例的Linux基础软件依赖关系分析方法,图5所示的根据本发明第二实施例的Linux基础软件依赖关系分析方法多了步骤S250,即元素重要性评估步骤。下面将详细描述步骤S250的示例性实现方法。关于步骤S210到步骤S240的功能和实现可以参考结合图1描述的步骤S110到步骤S140的功能和实现。
如图5所示,在步骤S250中,依据元素之间的依赖关系,对集合{X}中的每个元素,计算该元素被其他元素直接依赖和间接依赖的总次数,得出该元素的重要性评估。
下面描述对集合{X}中的每个元素,计算该元素被其他元素直接依赖和间接依赖的总次数的两种示例性方法。
图6示出了根据本发明一个实施例的对于集合{X}中的每个元素,计算该元素被其他元素直接依赖和间接依赖的总次数的示例性方法250的流程图。
在步骤S251中,初始化集合{X}中每个元素对应的计数器A和计数器B值均为0,其中计数器A的值表示该元素被其他元素依赖的次数,计数器B的值表示该元素一共依赖多少个其他元素,然后前进到步骤S252。
在步骤S252中,逐个处理集合{X}中的每个元素,如果该元素依赖其他某个元素,则被依赖的所述其他某个元素所对应的计数器A执行加一操作,该元素对应的计数器B值等于该元素依赖的其他元素的总个数,然后前进到步骤S253。
在步骤S253中,判断集合{X}中是否存在未被处理的元素,如果存在则返回步骤S252;否则结束该迭代处理,前进到步骤S254。
在步骤S254中,依据各个元素对应的计数器A和计数器B,得到每个元素被其他元素直接依赖和间接依赖的总次数。
图7示出了根据本发明另一个实施例的对于集合{X}中的每个元素,计算该元素被其他元素直接依赖和间接依赖的总次数的示例性方法250’的流程图。图7的步骤S251-S253与图6所示的对应步骤S251-S253的功能和操作相同,这里不再赘述。
图7与图6的不同在于步骤S254’-S258,这是基于如下考虑:对集合{X}中的所有元素,可以按对应的计数器A值从小到大进行排序,计数器A的值大表示该元素的重要程度,即该元素在整个Linux系统中越重要。但是这一判断并不准确,比如某个基础元素被依赖的次数很少,但是依赖它的几个元素被更高层的元素依赖次数很多,因此该基础元素实际上非常重要,因此可以执行步骤S254’-S258,以进一步准确反映集合{X}中每个元素的重要性。
在步骤S254’中,初始化一个集合{Y}为空,并为每个元素设置计数器C,计数器C值初始化为0,然后前进到步骤S255。
在步骤S255中,找到集合{X}中计数器A值为0的元素D,即不被其他任何集合{X}中的元素依赖的元素,如果存在多个计数器A值为0的元素,任选其中1个进行处理,然后前进到步骤S256。
在步骤S256中,对于步骤S255中找到的每个元素D,找到集合{Y}中哪些元素依赖元素D,计算这些元素的计数器C值之和Ve与这些元素的总个数Vf,设置该元素D的计数器C值为Ve+Vf;然后将该元素D从集合{X}中删除,并将该元素加入集合{Y},再在集合{X}中找到被元素D依赖的所有元素,将这些元素的计数器A值减1,然后前进到步骤S257。
在步骤S257中,判断集合{X}中是否为空,如不为空回到步骤S255;否则进入步骤S258。
在步骤S258中,依据集合{Y}中的每个元素的元素计数器C值,得到该元素的重要性评估。
可选地,在一个示例中,例如可以根据用户的要求,将元素按照重要性评估排序,并且按照元素的重要性评估顺序,将集合{X}中的元素输出,例如以可视化形式输出元素X代表的循环依赖链,例如环形的链表。
利用本发明实施例的Linux基础软件依赖关系分析方法,可以在无需软件包描述信息的情况下,直接扫描Linux文件系统中所有的二进制文件(包括可执行文件和库文件),从而直接获得Linux系统中内核之上的所有软件的二进制可执行文件和库文件之间的依赖关系,并给出所有二进制文件在整个Linux系统中的重要程度量化评价指标,可以为Linux系统安全性分析、Linux系统结构分析提供有力支持。
三、第三实施例
图8示出了根据本发明第三实施例的Linux基础软件依赖关系分析装置300的配置框图。
如图8所示,Linux基础软件依赖关系分析装置300可以包括Linux系统扫描部件310、文件间依赖关系获得部件320、循环依赖关系去除部件330、元素间依赖关系图构建部件340。
Linux系统扫描部件310配置为扫描一个Linux系统,得到所有二进制可执行文件和库文件的列表。
文件间依赖关系获得部件320配置为获得该列表中的文件之间的依赖关系。
循环依赖关系去除部件330配置为消除二进制文件的循环依赖关系,构建集合{X},其中集合{X}由彼此之间不存在循环依赖关系的元素组成,元素X为由处于一个循环依赖链上的所有文件构成的集合或者由不存在于任何一个循环依赖链中的单个文件构成的集合。
元素间依赖关系图构建部件340配置为对集合{X}中的每个元素,依据步骤2获得的文件之间的依赖关系,建立元素之间的依赖关系,其中如果一个元素中存在多个文件与另一个元素中的多个文件存在依赖关系,两个元素之间只记为一个依赖关系,集合{X}中各元素的依赖关系是一个内部不存在循环依赖的树状依赖关系图。
有关Linux系统扫描部件310、文件间依赖关系获得部件320、循环依赖关系去除部件330、元素间依赖关系图构建部件340的功能和实现可以参考前面结合图1到图7所做的描述,这里不再赘述。
需要说明的是,上述Linux基础软件依赖关系分析装置的各个部件可以用软件程序来实现,例如通过通用计算机中的CPU结合RAM和ROM等以及其中运行的软件代码来实现。软件程序可以存储在诸如闪存、软盘、硬盘、光盘等存储介质上,在运行时加载到诸如随机访问存储器RAM上来由CPU执行。另外,除了通用计算机上,还可以通过专用集成电路和软件之间的合作来实现。所述集成电路包括通过例如MPU(微处理单元)、DSP(数字信号处理器)、FPGA(现场可编程门阵列)、ASIC(专用集成电路)等中的至少一个来实现。另外,Linux基础软件依赖关系分析装置的各个部件可以用专门的硬件来实现,例如特定的现场可编程门阵列、专用集成电路等。另外,图像编码器的各个部件也可以利用软件和硬件的结合来实现。
上述Linux基础软件依赖关系分析装置中的各个单元的结构和数量不对本发明的范围构成限制。根据本发明的一个实施例,各个部件可以合并为一个独立的部件来执行和实现相应的功能和操作,或者各个部件进一步拆分为更小的单元来实现他们各自的功能和操作。
以上已经描述了本发明的各实施例,上述说明是示例性的,并非穷尽性的,并且也不限于所披露的各实施例。在不偏离所说明的各实施例的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。因此,本发明的保护范围应该以权利要求的保护范围为准。

Claims (10)

1.一种用于分析Linux基础软件之间的依赖关系的Linux基础软件依赖关系分析方法,包括:
步骤1:扫描一个Linux系统,得到所有二进制文件的列表,二进制文件包括二进制可执行文件和库文件;
步骤2:获得该列表中的二进制文件之间的依赖关系;
步骤3:消除二进制文件的循环依赖关系,构建集合{X},其中集合{X}由彼此之间不存在循环依赖关系的元素组成,元素X为由处于一个循环依赖链上的所有二进制文件构成的集合或者由不存在于任何一个循环依赖链中的单个二进制文件构成的集合;
步骤4:对集合{X}中的每个元素,依据步骤2获得的二进制文件之间的依赖关系,建立元素之间的依赖关系,其中如果一个元素中存在多个二进制文件与另一个元素中的多个二进制文件存在依赖关系,两个元素之间只记为一个依赖关系,集合{X}中各元素的依赖关系是一个内部不存在循环依赖的树状依赖关系图。
2.根据权利要求1的Linux基础软件依赖关系分析方法,所述步骤2的获得二进制文件之间的依赖关系包括:
步骤2-1:对列表中的每个二进制文件,分析该二进制文件与其他二进制文件之间的函数调用关系,获得该二进制文件所依赖的其他二进制文件的集合;以及
步骤2-2:对上述集合中的每个被依赖的二进制文件,建立一个从被分析的二进制文件到集合中被依赖的该二进制文件的有向依赖连接。
3.根据权利要求1或2的Linux基础软件依赖关系分析方法,所述步骤3的消除二进制文件的循环依赖关系包括:
步骤3-1:查找系统二进制文件的循环依赖关系;
步骤3-2:对于找到的每个循环依赖关系,由处于循环依赖链上的所有二进制文件构成一个集合,记为集合Xi,i=0...M-1,其中M表示整个系统中没有重叠的循环依赖链个数,M为大于等于1的正整数;
步骤3-3:将其他不存在于任何一个循环依赖链中的二进制文件记为只有一个元素的集合Xj,j=M...M+N-1,N表示系统中不在任何一个循环依赖链中的二进制文件个数,N为大于等于1的正整数;以及
步骤3-4:由所有的Xi和Xj构成所述集合{X},该集合{X}的大小为N+M。
4.根据权利要求1或2的Linux基础软件依赖关系分析方法,还包括:
步骤5:依据元素之间的依赖关系,对集合{X}中的每个元素,计算该元素被其他元素直接依赖和间接依赖的总次数,得出该元素的重要性评估。
5.根据权利要求4的Linux基础软件依赖关系分析方法,所述步骤5的对集合{X}中的每个元素,计算该元素被其他元素直接依赖和间接依赖的总次数包括:
步骤5-1:初始化集合{X}中每个元素对应的计数器A和计数器B值均为0,计数器A的值表示该元素被其他元素依赖的次数,计数器B的值表示该元素一共依赖多少个其他元素;
步骤5-2:逐个处理集合{X}中的每个元素,如果该元素依赖其他某个元素,则被依赖的所述其他某个元素所对应的计数器A执行加一操作,该元素对应的计数器B值等于该元素依赖的其他元素的总个数,
步骤5-3:判断集合{X}中是否存在未被处理的元素,如果还有则返回步骤S5-2;否则结束迭代处理;
步骤5-4:依据各个元素对应的计数器A和计数器B,得到每个元素被其他元素直接依赖和间接依赖的总次数。
6.根据权利要求4的Linux基础软件依赖关系分析方法,所述步骤5的对集合{X}中的每个元素,计算该元素被其他元素直接依赖和间接依赖的总次数包括:
步骤5-1:初始化集合{X}中每个元素对应的计数器A和计数器B值均为0,计数器A的值表示该元素被其他元素依赖的次数,计数器B的值表示该元素一共依赖多少个其他元素;
步骤5-2:逐个处理集合{X}中的每个元素,如果该元素依赖其他某个元素,则被依赖的所述其他某个元素所对应的计数器A执行加一操作,该元素对应的计数器B值等于该元素依赖的其他元素的总个数,
步骤5-3:判断集合{X}中是否存在未被处理的元素,如果还有则返回步骤5-2;否则结束迭代处理;
步骤5-4:初始化一个集合{Y}为空,并为每个元素设置计数器C,计数器C值初始化为0;
步骤5-5:找到集合{X}中计数器A值为0的元素D,即不被其他任何集合{X}中的元素依赖的元素,如果存在多个计数器A值为0的元素,任选其中1个进行处理,
步骤5-6:对于步骤5-5中找到的每个元素D,找到集合{Y}中哪些元素依赖元素D,计算这些元素的计数器C值之和Ve与这些元素的总个数Vf,设置该元素D的计数器C值为Ve+Vf;然后将该元素D从集合{X}中删除,并将该元素加入集合{Y},再在集合{X}中找到被元素D依赖的所有元素,将这些元素的计数器A值减1;
步骤5-7:检查集合{X}中是否为空,如不为空回到步骤5-5;否则进入步骤5-8;以及
步骤5-8:依据集合{Y}中的每个元素的元素计数器C值,得到该元素的重要性评估。
7.根据权利要求1或2的Linux基础软件依赖关系分析方法,所述步骤2的获得二进制文件之间的依赖关系包括下述操作中的至少一个:
利用ldd命令分析库调用的依赖关系;以及
利用readelf工具分析二进制可执行文件或库的依赖性。
8.根据权利要求1的Linux基础软件依赖关系分析方法,所述步骤3的消除二进制文件的循环依赖关系包括:
步骤3-1:将系统中的所有二进制文件加入集合{S},初始化一个集合{C}为空,用于记录后续步骤中发现的循环依赖二进制文件集合;
步骤3-2:从集合{S}中随机选取一个二进制文件T,并将该二进制文件T从集合{S}中删除,将该二进制文件T加入集合{P},初始情况下集合P只包含该二进制文件T本身一个元素;
步骤3-3:利用深度优先搜索算法搜索二进制文件T依赖的所有二进制文件,每执行一步深度优先搜索,将相应的二进制文件加入集合{P},如果新加入集合{P}的二进制文件为T,则表示对应的深度优先搜索路径构成了一个二进制文件循环依赖,跳至步骤3-5;否则继续深度优先搜索,直到没有进一步依赖的二进制文件时该深度优先搜索路径结束,再递归进入下一条深度优先搜索路径,从集合{P}中删除递归之前的相关二进制文件;
步骤3-4:将二进制文件T从集合{S}中删除,跳转至步骤3-8;
步骤3-5:将集合{P}中的所有仍在集合{S}中的二进制文件从集合{S}中删除;
步骤3-6:检查集合{P}与集合{C}中已有的元素是否存在重叠,如果有重叠,则合并两个集合,删除集合{C}中原有与集合{P}存在重叠的元素,将合并后的集合做为一个新的元素重新放入集合{C},跳至步骤3-7;
步骤3-7:如集合{P}与集合{C}中已有的元素不存重叠,则将集合{P}做为一个新元素放入集合{C};
步骤8:清空集合{P};
步骤9:判断集合{S}是否为空,如为空,则结束处理;如果集合{S}不为空,即表示还有尚未分析的二进制文件,则回到步骤2;
步骤10:将集合{C}中的每个元素作为存在循环依赖关系的若干个二进制文件的集合加入集合{X}中,作为元素X,其中集合{C}中的元素个数即为系统中存在的不互相交叉的循环依赖关系的个数,集合{C}中的每个元素为存在循环依赖关系的若干个二进制文件的集合。
9.一种用于分析Linux基础软件之间的依赖关系的Linux基础软件依赖关系分析方法,包括:
步骤1:扫描一个Linux系统中,得到所有二进制文件的列表,二进制文件包括二进制可执行文件和库文件;
步骤2:逐个分析每个二进制文件的函数调用关系,获得该文件所依赖的其他二进制文件的集合;
步骤3:对上述集合中的每个被依赖的二进制文件,建立一个从被分析的二进制文件到集合中被依赖的该二进制文件的有向依赖连接;
步骤4:检查Linux系统中的所有二进制文件是否都被分析过,如果还有没有被分析的二进制文件,回到步骤2;否则进入步骤5;
步骤5:查找系统二进制文件的循环依赖关系,对于找到的每个循环依赖关系,处于循环依赖链上的所有二进制文件构成一个集合,记为集合Xi,i=0...M-1,M表示整个系统中没有重叠的循环依赖链个数;其他不存在于任何一个循环依赖链中的二进制文件被记为只有一个元素的集合Xj,j=M...M+N-1,N表示系统中不在任何一个循环依赖链中的二进制文件个数;由所有的Xi和Xj构成一个新的集合{X},该集合的大小为N+M;
步骤6:对集合{X}中的每个元素,依据步骤2到步骤4获得的二进制文件之间的依赖关系,建立元素之间的依赖关系,如果一个元素中存在多个二进制文件与另一个元素中的多个二进制文件存在依赖关系,两个元素之间只记为一个依赖关系,集合{X}中各元素的依赖关系是一个内部不存在循环依赖的树状依赖关系图;
步骤7:初始化集合{X}中每个元素对应的计数器A和计数器B值均为0,计数器A的值表示该二进制文件被其他二进制文件依赖的次数,计数器B的值表示该二进制文件一共依赖多少个其他二进制文件;
步骤8:逐个处理集合{X}中的每个元素,如果该元素依赖其他某个元素,则被依赖的元素(即所述的其他某个元素)所对应的计数器A执行加一操作,该元素对应的计数器B值等于该元素依赖的其他元素的总个数;
步骤9:集合{X}中是否存在未被处理的元素,如果还有则返回步骤8;否则进入步骤10;
步骤10:此时集合{X}中每个元素对应的计数器A值表示该元素总计被多少个其他元素依赖,计数器B值表示该元素依赖多少个其他元素,对集合{X}中的所有元素,按对应的计数器A值从小到大进行排序,计数器A的值表示该元素的重要程度;
步骤11:初始化一个集合{Y}为空,并为每个元素设置计数器C,计数器C值初始化为0;
步骤12:找到集合{X}中计数器A值为0的元素D,即不被其他任何集合{X}中的元素依赖的元素,如果存在多个计算器A值为0的元素,任选其中1个进行处理;
步骤13:对于步骤12中找到的每个元素D,找到集合{Y}中哪些元素依赖元素D,计算这些元素的计数器C值之和Ve与这些元素的总个数Vf,设置则该元素的计数器C值为Ve+Vf,然后将该元素从集合{X}中删除,并将该元素加入集合{Y},再在集合{X}中找到被元素D依赖的所有元素,将这些元素的计数器A值减1;
步骤14:检查集合{X}中是否为空,如不为空回到步骤12,否则进入步骤15;以及
步骤15:存储集合{Y}作为Linux基础软件依赖关系分析的结果,集合{Y}中包含了所有的元素,包括单个二进制文件元素,也包括存在二进制文件循环依赖关系的封闭依赖链元素组成的集合元素,集合{Y}中的每个元素计数器C值代表了该元素被其他元素直接依赖和间接依赖的总次数,该元素计数器C值更能反映单个元素在整个Linux系统中的重要程度,被直接依赖和间接依赖总次数越多的元素,其重要性越强。
10.根据权利要求9的Linux基础软件依赖关系分析方法,所述步骤2的逐个分析每个二进制文件的函数调用关系,获得该文件所依赖的其他二进制文件的集合包括下述操作中的至少一种:
利用ldd命令分析库调用的依赖关系;以及
利用readelf工具分析二进制可执行文件或库的依赖性。
CN201410291217.2A 2014-06-25 2014-06-25 基于文件的Linux基础软件依赖关系分析方法 Active CN104063220B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201410291217.2A CN104063220B (zh) 2014-06-25 2014-06-25 基于文件的Linux基础软件依赖关系分析方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201410291217.2A CN104063220B (zh) 2014-06-25 2014-06-25 基于文件的Linux基础软件依赖关系分析方法

Publications (2)

Publication Number Publication Date
CN104063220A CN104063220A (zh) 2014-09-24
CN104063220B true CN104063220B (zh) 2017-04-12

Family

ID=51550944

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201410291217.2A Active CN104063220B (zh) 2014-06-25 2014-06-25 基于文件的Linux基础软件依赖关系分析方法

Country Status (1)

Country Link
CN (1) CN104063220B (zh)

Families Citing this family (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104866369B (zh) * 2015-05-22 2018-05-08 广州华多网络科技有限公司 一种数据处理的方法以及装置
CN106547527B (zh) * 2015-09-22 2020-01-21 阿里巴巴集团控股有限公司 一种JavaScript文件构建方法及装置
CN107301063B (zh) * 2017-05-10 2020-07-31 北京奇艺世纪科技有限公司 一种镜像管理方法及装置
CN109086050B (zh) * 2018-07-04 2021-11-30 烽火通信科技股份有限公司 一种模块依赖关系的分析方法及系统
CN112748952A (zh) * 2019-10-30 2021-05-04 武汉斗鱼鱼乐网络科技有限公司 一种环形依赖关系的检测方法、装置、设备和存储介质
CN112148673A (zh) * 2020-09-22 2020-12-29 北京中房智宝科技有限公司 一种多二进制合并成一个二进制文件读写错误的解决方法
CN113742002A (zh) * 2021-09-10 2021-12-03 上海达梦数据库有限公司 一种动态库依赖关系获取方法、装置、设备及存储介质

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1945530A (zh) * 2006-11-07 2007-04-11 中兴通讯股份有限公司 具有依赖关系组件的部署系统和方法
CN102880493A (zh) * 2012-09-25 2013-01-16 南京大学 一种构件间动态依赖关系的自动分析方法

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2009237762A (ja) * 2008-03-26 2009-10-15 Toshiba Corp プログラム解析装置、プログラム解析方法および解析プログラム

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1945530A (zh) * 2006-11-07 2007-04-11 中兴通讯股份有限公司 具有依赖关系组件的部署系统和方法
CN102880493A (zh) * 2012-09-25 2013-01-16 南京大学 一种构件间动态依赖关系的自动分析方法

Also Published As

Publication number Publication date
CN104063220A (zh) 2014-09-24

Similar Documents

Publication Publication Date Title
CN104063220B (zh) 基于文件的Linux基础软件依赖关系分析方法
Toda et al. Implementing efficient all solutions SAT solvers
US8239404B2 (en) Identifying entries and exits of strongly connected components
Bouckaert et al. WEKA manual for version 3-6-2
CN108647145B (zh) 软件内存安全检测方法及系统
US9098630B2 (en) Data selection
US8799859B2 (en) Augmented design structure matrix visualizations for software system analysis
Matentzoglu et al. A Corpus of OWL DL Ontologies.
CN108491228A (zh) 一种二进制漏洞代码克隆检测方法及系统
CN106682514B (zh) 基于子图挖掘的系统调用序列特征模式集生成方法
CN104866764B (zh) 一种基于对象引用图的Android手机恶意软件检测方法
Zhang et al. I/O efficient: Computing SCCs in massive graphs
Arge et al. On external-memory MST, SSSP and multi-way planar graph separation
Ashraf et al. TKN: an efficient approach for discovering top-k high utility itemsets with positive or negative profits
CN113268485B (zh) 数据表关联分析方法、装置、设备及存储介质
Elffers A cardinal improvement to pseudo-Boolean solving
Tan et al. E-sc4r: Explaining software clustering for remodularisation
JP2017049639A (ja) 評価プログラム、手順書評価方法、および評価装置
CN116560984A (zh) 一种基于调用依赖图的测试用例聚类分组方法
JP2013077124A (ja) ソフトウェアテストケース生成装置
Chen et al. Employing a parametric model for analytic provenance
Asaduzzaman Visualization and analysis of software clones
Tiihonen et al. Coping with Inconsistent Models of Requirements.
US7562055B2 (en) Resolve trace minimization
Li et al. Mining productive itemsets in dynamic databases

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant