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

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

【技术领域】
[0001] 本发明总体地涉及Linux系统,更具体地涉及Linux基础软件依赖关系分析方法。

【背景技术】
[0002] -个典型的Linux系统中包含数以千计的软件包,数以万计的可执行文件,如果 每个软件的功能实现都从Linux最底层的系统调用开始构建,软件的设计会异常复杂、工 作量很大,因此实际的Linux软件系统中都包含各种面向不同目标的软件库。Linux系统 中这些软件包的二进制可执行文件与库文件之间存在互相依赖关系,不同的软件由不同的 开发者或开发团队进行开发,为了使得软件开发更加高效,软件的开发者会根据自己的知 识和软件开发效率的考虑,使得一些软件的功能可以通过调用其他软件库的API调用来实 现,从而让整个Linux系统的软件呈现出一种复杂的积木式结构,即每个软件功能都不是 很大,但通过复杂的组合形成一个较为复杂、较为完备的应用系统。
[0003] 传统的Linux系统采用包管理的方式来组织管理Linux系统中复杂的软件结构, 每个软件包中都包含一个描述文件来表述该软件包依赖哪些其他软件包,比如RPM包管理 系统等,这样的设计使得Linux系统的使用和管理较为方便。不过包管理系统中的软件包 依赖关系描述文件是由富有经验的Linux系统开发人员手工指定的,不能自动化的生成软 件的依赖关系图,也不能用于Linux系统开发的结构分析和Linux系统的安全性分析。。


【发明内容】

[0004] 鉴于现有技术的以上情况,提出了本发明。
[0005] 根据本发明的一个方面,提出了一种用于分析Linux基础软件之间的依赖关系的 Linux基础软件依赖关系分析方法,可以包括:
[0006] 步骤1 :扫描一个Linux系统,得到所有二进制可执行文件和库文件的列表;
[0007] 步骤2 :获得该列表中的文件之间的依赖关系;
[0008] 步骤3 :消除二进制文件的循环依赖关系,构建集合{X},其中集合{X}由彼此之间 不存在循环依赖关系的元素组成,元素 X为由处于一个循环依赖链上的所有文件构成的集 合或者由不存在于任何一个循环依赖链中的单个文件构成的集合;
[0009] 步骤4:对集合{X}中的每个元素,依据步骤2获得的文件之间的依赖关系,建立 元素之间的依赖关系,如果一个元素中存在多个文件与另一个元素中的多个文件存在依赖 关系,两个元素之间只记为一个依赖关系,集合{X}中各元素的依赖关系是一个内部不存 在循环依赖的树状依赖关系图。
[0010] 利用本发明实施例的Linux基础软件依赖关系分析方法,可以在无需软件包描述 信息的情况下,直接获得Linux系统中内核之上的所有软件的二进制可执行文件和库文件 之间的依赖关系。
[0011] 根据本发明的另一方面,提供了一种用于分析Linux基础软件之间的依赖关系的 Linux基础软件依赖关系分析方法,可以包括:
[0012] 步骤1 :扫描一个Linux系统中,得到所有二进制可执行文件和库文件的列表;
[0013] 步骤2 :逐个分析每个二进制可执行文件和库文件的函数调用关系,获得该文件 所依赖的其他二进制可执行文件和库文件的集合;
[0014] 步骤3 :对上述集合中的每个被依赖的二进制文件,建立一个从被分析的二进制 文件到集合中被依赖的该二进制文件的有向依赖连接;
[0015] 步骤4 :检查Linux系统中的所有二进制文件是否都被分析过,如果还有没有被分 析的二进制文件,回到步骤2 ;否则进入步骤5 ;
[0016] 步骤5 :查找系统二进制文件的循环依赖关系,对于找到的每个循环依赖关系,处 于循环依赖链上的所有文件构成一个集合,记为集合Xi,i = 〇... M-1,M表示整个系统中没 有重叠的循环依赖链个数;其他不存在于任何一个循环依赖链中的文件被记为只有一个元 素的集合Xj,j = M.. .M+N-l,N表示系统中不在任何一个循环依赖链中的文件个数;由所 有的Xi和Xj构成一个新的集合{X},该集合的大小为N+M ;
[0017] 步骤6 :对集合{X}中的每个元素,依据步骤2到步骤4获得的文件之间的依赖关 系,建立元素之间的依赖关系,如果一个元素中存在多个文件与另一个元素中的多个文件 存在依赖关系,两个元素之间只记为一个依赖关系,集合{X}中各元素的依赖关系是一个 内部不存在循环依赖的树状依赖关系图;
[0018] 步骤7 :初始化集合{X}中每个元素对应的计数器A和计数器B值均为0。计数器 A的值表示该二进制文件被其他文件依赖的次数,计数器B的值表示该二进制文件一共依 赖多少个其他二进制文件;
[0019] 步骤8 :逐个处理集合{X}中的每个元素,如果该元素依赖其他某个元素,则被依 赖的元素(即所述的其他某个元素)所对应的计数器A执行加一操作,该元素对应的计数 器B值等于该元素依赖的其他元素的总个数;
[0020] 步骤9 :集合{X}中是否存在未被处理的元素,如果还有则返回步骤8 ;否则进入 步骤10 ;
[0021] 步骤10 :此时集合{X}中每个元素对应的计数器A值表示该元素总计被多少个其 他元素依赖,计数器B值表示该元素依赖多少个其他元素,对集合{X}中的所有元素,按对 应的计数器A值从小到大进行排序,计数器A的值大表示该元素的重要程度;
[0022] 步骤11 :初始化一个集合{Y}为空,并为每个元素设置计数器C,计数器C值初始 化为〇 ;
[0023] 步骤12 :找到集合{X}中计数器A值为0的元素 D,即不被其他任何集合{X}中的 元素依赖的元素,如果存在多个计算器A值为0的元素,任选其中1个进行处理;
[0024] 步骤13 :对于步骤12中找到的每个元素 D,找到集合{Y}中哪些元素依赖元素 D, 计算这些元素的计数器C值之和Ve与这些元素的总个数Vf,设置则该元素的计数器C值为 Ve+Vf,然后将该元素从集合{X}中删除,并将该元素加入集合{Y},再在集合{X}中找到被 元素 D依赖的所有元素,将这些元素的计数器A值减1 ;
[0025] 步骤14 :检查集合{X}中是否为空,如不为空回到步骤12,否则进入步骤15 ;以及
[0026] 步骤15 :存储结合{Y}作为Linux基础软件依赖关系分析的结果,集合{Y}中包 含了所有的元素,包括单个文件元素,也包括存在文件循环依赖关系的封闭依赖链元素组 成的集合元素,集合{Y}中的每个元素计数器C值代表了该元素被其他元素直接依赖和间 接依赖的总次数,该值更能反映单个元素在整个Linux系统中的重要程度,被直接依赖和 间接依赖总次数越多的元素,其重要性越强。
[0027] 利用本发明实施例的Linux基础软件依赖关系分析方法,可以在无需软件包描述 信息的情况下,直接扫描Linux文件系统中所有的二进制文件(包括可执行文件和库文 件),从而直接获得Linux系统中内核之上的所有软件的二进制可执行文件和库文件之间 的依赖关系,并给出所有二进制文件在整个Linux系统中的重要程度量化评价指标,可以 为Linux系统安全性分析、Linux系统结构分析提供有力支持。

【专利附图】

【附图说明】
[0028] 从下面结合附图对本发明实施例的详细描述中,本发明的这些和/或其它方面和 优点将变得更加清楚并更容易理解,其中:
[0029] 图1示出了根据本发明第一实施例的用于分析Linux基础软件之间的依赖关系的 Linux基础软件依赖关系分析方法100的总体流程图。
[0030] 图2示出了执行ldd命令的执行结果示意图。
[0031] 图3示出了执行该readelf相关命令的执行结果示意图。
[0032] 图4示出了根据本发明一个实施例的消除二进制文件的循环依赖关系的示例性 方法130的流程图。
[0033] 图5示出了根据本发明第二实施例的Linux基础软件依赖关系分析方法200的总 体流程图。
[0034] 图6示出了根据本发明一个实施例的对于集合{X}中的每个元素,计算该元素被 其他元素直接依赖和间接依赖的总次数的示例性方法250的流程图。
[0035] 图7示出了根据本发明另一个实施例的对于集合{X}中的每个元素,计算该元素 被其他元素直接依赖和间接依赖的总次数的示例性方法250'的流程图。
[0036] 图8示出了根据本发明第三实施例的Linux基础软件依赖关系分析装置300的配 置框图。

【具体实施方式】
[0037] 为了使本领域技术人员更好地理解本发明,下面结合附图和【具体实施方式】对本发 明作进一步详细说明。
[0038] 在本文中,术语"二进制文件"是二进制可执行文件和二进制库文件的统称。
[0039] 在本文中,除非特别说明或者和其他修饰词结合出现或者根据上下文明显为其他 含义,否则单独出现的词汇"文件"指代二进制文件。
[0040] 在本文中,"没有重叠的依赖循环链"表示任意两个循环依赖链上的文件集合没有 交集。
[0041] 一、第一实施例
[0042] 图1示出了根据本发明第一实施例的用于分析Linux基础软件之间的依赖关系的 Linux基础软件依赖关系分析方法100的总体流程图。
[0043] 在步骤S110中,扫描一个Linux系统,得到所有二进制可执行文件和库文件的列 表,然后前进到步骤S120。
[0044] 在步骤S120中,获得该列表中的文件之间的依赖关系。这里的文件之间的依赖关 系指的是文件之间存在直接依赖关系,即直接的调用和被调用关系。
[0045] 在一个示例中,获得文件之间的依赖关系可以包括:
[0046] 步骤1 :对列表中的每个二进制可执行文件和库文件,分析该文件与其他文件之 间的函数调用关系,获得该文件所依赖的其他二进制可执行文件和库文件的集合;以及
[0047] 步骤2 :对上述集合中的每个被依赖的二进制文件,建立一个从被分析的二进制 文件到集合中被依赖的该二进制文件的有向依赖连接。
[0048] 下面给出得到二进制文件之间的函数调用依赖关系,从而确定两个二进制文件之 间的依赖关系的示例性方法。
[0049] 例如,二进制文件之间的依赖关系可以用如下两种方法获得:
[0050] 1)方法1 :利用ldd命令分析库调用的依赖关系。
[0051] 通过执行"ldd待分析的二进制文件全路径名"命令,可以获得该文件依赖哪些二 进制库文件。比如执行如下命令:
[0052] ldd/usr/bin/as
[0053] 可以获得as文件依赖libc. so. 6等二进制文件,图2给出了执行ldd命令的执行 结果示意图。
[0054] 2)方法2 :利用readelf工具分析可执行文件/库的依赖性。
[0055] 通过执行"readelf-dynamic待分析的二进制文件全路径名"命令,可以获得该文 件依赖哪些二进制库文件。比如执行如下命令 :
[0056] readelf - dynamic/usr/bin/as
[0057] 可以获得as文件依赖libc. so. 6等二进制文件,图3给出了执行该readelf相关 命令的执行结果示意图。
[0058] 通过例如以上两种方法的任一个或者其组合,可以逐个处理Linux系统中每个有 待分析的二进制可执行文件或二进制库文件,从而获得所有待分析的二进制文件之间的依 赖关系。
[0059] 在步骤S120中获得该列表中的文件之间的依赖关系之后,前进到步骤S130。
[0060] 在步骤S130中,消除二进制文件的循环依赖关系,构建集合{X},其中集合{X}由 彼此之间不存在循环依赖关系的元素组成,元素 X为由处于一个循环依赖链上的所有文件 构成的集合或者由不存在于任何一个循环依赖链中的单个文件构成的集合。
[0061] 下面参考图4描述根据本发明一个实施例的消除二进制文件的循环依赖关系的 示例性方法130的过程。
[0062] 在步骤S131中,查找系统二进制文件的循环依赖关系,然后前进到步骤S132。
[0063] 下面详细描述查找系统二进制文件的循环依赖关系的一个示例性方法。
[0064] 由于Linux系统是一个复杂的积木式软件系统,经过长期的演化和发展,一些软 件之间可能存在互相依赖关系,比如二进制文件A依赖二进制文件B,同时二进制文件B又 依赖二进制文件A。再比如二进制文件A依赖二进制文件B,二进制文件B依赖二进制文件 C,而二进制文件C又依赖二进制文件A,从而构成一个环形的循环依赖关系。上述环形的循 环依赖关系仅为示例,可以存在其他形式的或者更复杂的循环依赖关系。
[0065] 以上循环依赖关系可能导致图1中的步骤4及可选的其后的步骤形成无限循环操 作,导致处理流程死锁。为避免该问题,需要将所有存在循环依赖关系的相关二进制文件合 并成一个文件集合,在新的集合中被视为一个元素,从而让所有元素呈现为一种单向的树 状依赖图。
[0066] 作为示例,可以利用下述方法来遍历查找出Linux系统中的所有二进制文件循环 依赖关系:
[0067] 步骤1 :将系统中的所有二进制文件加入集合{S},以及初始化一个集合{C}为空, 用于记录后续步骤中发现的循环依赖文件集合。
[0068] 步骤2 :从集合{S}中随机选取一个文件T,并将该文件T从集合{S}中删除。将 该二进制文件T加入集合{P},初始情况下集合P只包含该文件T本身一个元素。
[0069] 步骤3 :利用深度优先搜索算法搜索文件X依赖的所有二进制文件,每执行一步深 度搜索,将相应的二进制文件加入集合{P},如果新加入集合{P}的二进制文件为T,则表示 该深度优先搜索路径构成了一个二进制文件循环依赖,跳至步骤5 ;否则继续深度优先搜 索,直到没有进一步依赖的二进制文件时该条深度优先搜索路径结束,再递归进入下一条 深度优先搜索路径,从集合{P}中删除递归之前的相关文件。
[0070] 步骤4 :将文件T从集合{S}中删除,跳转至步骤8。
[0071] 步骤5 :将集合{P}中的所有仍在集合{S}中的二进制文件从集合{S}中删除。
[0072] 步骤6 :检查集合{P}与集合{C}中已有的元素是否存在重叠,如果有重叠,则合 并两个集合,删除集合{C}中原有与集合{P}存在重叠的元素,将合并后的集合做为一个新 的元素重新放入集合{C},跳至步骤7。
[0073] 步骤7 :如集合{P}与集合{C}中已有的元素不存重叠,则将集合{P}做为一个新 元素放入集合{C}。
[0074] 步骤8 :清空集合{P}。
[0075] 步骤9 :判断集合{S}是否为空,如为空,则结束处理;如果集合{S}不为空,即表 示还有尚未分析的二进制文件,则回到步骤2。
[0076] 经过上述步骤的遍历搜索,集合{C}中的元素个数即为系统中存在的不互相交叉 的循环依赖关系的个数,集合{C}中的每个元素为存在循环依赖关系的若干个二进制文件 的集合,可用于图1中的步骤S130中集合{X}的构建。
[0077] 在步骤S131中查找系统二进制文件的循环依赖关系之后前进到步骤S132。
[0078] 在步骤S132中,对于找到的每个循环依赖关系,由处于循环依赖链上的所有文件 构成一个集合,记为集合Xi,i = 〇. ..M-1,其中Μ表示整个系统中没有重叠的循环依赖链 个数,Μ为大于等于1的正整数。然后,前进到步骤S132。
[0079] 在步骤133中,将其他不存在于任何一个循环依赖链中的文件记为只有一个元素 的集合Xj,j = M. . . M+N-l,Ν表示系统中不在任何一个循环依赖链中的文件个数,Ν为大于 等于1的正整数。然后,前进到步骤S134。
[0080] 在步骤S134中,由所有的Xi和Xj构成所述集合{X},该集合{X}的大小为N+M。
[0081] 返回到图1,在步骤S130中消除二进制文件的循环依赖关系并构建集合{X}之后, 前进到步骤S140。
[0082] 在步骤S140中,对集合{X}中的每个元素,依据步骤S120获得的文件之间的依赖 关系,建立元素之间的依赖关系,其中如果一个元素中存在多个文件与另一个元素中的多 个文件存在依赖关系,两个元素之间只记为一个依赖关系,集合{X}中各元素的依赖关系 是一个内部不存在循环依赖的树状依赖关系图。
[0083] 不同于常见及的基于软件包信息的软件包依赖关系分析方法,利用结合图1描述 的本发明实施例的Linux基础软件依赖关系分析方法,在无需软件包描述信息的情况下, 直接扫描Linux文件系统中所有的二进制文件(包括可执行文件和库文件),从而能够直接 获得Linux系统中内核之上的所有软件的二进制可执行文件和库文件之间的依赖关系,可 以为Linux系统安全性分析、Linux系统结构分析提供有力支持。
[0084] 二、第二实施例
[0085] 图5示出了根据本发明第二实施例的Linux基础软件依赖关系分析方法200的总 体流程图。
[0086] 相比于结合图1描述的根据本发明第一实施例的Linux基础软件依赖关系分析方 法,图5所示的根据本发明第二实施例的Linux基础软件依赖关系分析方法多了步骤S250, 即元素重要性评估步骤。下面将详细描述步骤S250的示例性实现方法。关于步骤S210到 步骤S240的功能和实现可以参考结合图1描述的步骤S110到步骤S140的功能和实现。 [0087] 如图5所示,在步骤S250中,依据元素之间的依赖关系,对集合{X}中的每个元 素,计算该元素被其他元素直接依赖和间接依赖的总次数,得出该元素的重要性评估。
[0088] 下面描述对集合{X}中的每个元素,计算该元素被其他元素直接依赖和间接依赖 的总次数的两种示例性方法。
[0089] 图6示出了根据本发明一个实施例的对于集合{X}中的每个元素,计算该元素被 其他元素直接依赖和间接依赖的总次数的示例性方法250的流程图。
[0090] 在步骤S251中,初始化集合{X}中每个元素对应的计数器A和计数器B值均为0, 其中计数器A的值表示该元素被其他元素依赖的次数,计数器B的值表示该元素一共依赖 多少个其他元素,然后前进到步骤S252。
[0091] 在步骤S252中,逐个处理集合{X}中的每个元素,如果该元素依赖其他某个元素, 则被依赖的所述其他某个元素所对应的计数器A执行加一操作,该元素对应的计数器B值 等于该元素依赖的其他元素的总个数,然后前进到步骤S253。
[0092] 在步骤S253中,判断集合{X}中是否存在未被处理的元素,如果存在则返回步骤 S252 ;否则结束该迭代处理,前进到步骤S254。
[0093] 在步骤S254中,依据各个元素对应的计数器A和计数器B,得到每个元素被其他元 素直接依赖和间接依赖的总次数。
[0094] 图7示出了根据本发明另一个实施例的对于集合{X}中的每个元素,计算该元 素被其他元素直接依赖和间接依赖的总次数的示例性方法250'的流程图。图7的步骤 S251-S253与图6所示的对应步骤S251-S253的功能和操作相同,这里不再赘述。
[0095] 图7与图6的不同在于步骤S254' -S258,这是基于如下考虑:对集合{X}中的所 有元素,可以按对应的计数器A值从小到大进行排序,计数器A的值大表示该元素的重要程 度,即该元素在整个Linux系统中越重要。但是这一判断并不准确,比如某个基础元素被依 赖的次数很少,但是依赖它的几个元素被更高层的元素依赖次数很多,因此该基础元素实 际上非常重要,因此可以执行步骤S254' -S258,以进一步准确反映集合{X}中每个元素的 重要性。
[0096] 在步骤S254'中,初始化一个集合{Y}为空,并为每个元素设置计数器C,计数器C 值初始化为〇,然后前进到步骤S255。
[0097] 在步骤S255中,找到集合{X}中计数器A值为0的元素 D,即不被其他任何集合 {X}中的元素依赖的元素,如果存在多个计数器A值为0的元素,任选其中1个进行处理,然 后前进到步骤S256。
[0098] 在步骤S256中,对于步骤S255中找到的每个元素 D,找到集合{Y}中哪些元素依 赖元素 D,计算这些元素的计数器C值之和Ve与这些元素的总个数Vf,设置该元素 D的计 数器C值为Ve+Vf ;然后将该元素 D从集合{X}中删除,并将该元素加入集合{Y},再在集合 {X}中找到被元素 D依赖的所有元素,将这些元素的计数器A值减1,然后前进到步骤S257。
[0099] 在步骤S257中,判断集合{X}中是否为空,如不为空回到步骤S255 ;否则进入步 骤 S258。
[0100] 在步骤S258中,依据集合{Y}中的每个元素的元素计数器C值,得到该元素的重 要性评估。
[0101] 可选地,在一个示例中,例如可以根据用户的要求,将元素按照重要性评估排序, 并且按照元素的重要性评估顺序,将集合{X}中的元素输出,例如以可视化形式输出元素 X 代表的循环依赖链,例如环形的链表。
[0102] 利用本发明实施例的Linux基础软件依赖关系分析方法,可以在无需软件包描述 信息的情况下,直接扫描Linux文件系统中所有的二进制文件(包括可执行文件和库文 件),从而直接获得Linux系统中内核之上的所有软件的二进制可执行文件和库文件之间 的依赖关系,并给出所有二进制文件在整个Linux系统中的重要程度量化评价指标,可以 为Linux系统安全性分析、Linux系统结构分析提供有力支持。
[0103] 三、第三实施例
[0104] 图8示出了根据本发明第三实施例的Linux基础软件依赖关系分析装置300的配 置框图。
[0105] 如图8所示,Linux基础软件依赖关系分析装置300可以包括Linux系统扫描部 件310、文件间依赖关系获得部件320、循环依赖关系去除部件330、元素间依赖关系图构建 部件340。
[0106] Linux系统扫描部件310配置为扫描一个Linux系统,得到所有二进制可执行文件 和库文件的列表。
[0107] 文件间依赖关系获得部件320配置为获得该列表中的文件之间的依赖关系。
[0108] 循环依赖关系去除部件330配置为消除二进制文件的循环依赖关系,构建集合 {X},其中集合{X}由彼此之间不存在循环依赖关系的元素组成,元素 X为由处于一个循环 依赖链上的所有文件构成的集合或者由不存在于任何一个循环依赖链中的单个文件构成 的集合。
[0109] 元素间依赖关系图构建部件340配置为对集合{X}中的每个元素,依据步骤2获 得的文件之间的依赖关系,建立元素之间的依赖关系,其中如果一个元素中存在多个文件 与另一个元素中的多个文件存在依赖关系,两个元素之间只记为一个依赖关系,集合{X} 中各元素的依赖关系是一个内部不存在循环依赖的树状依赖关系图。
[0110] 有关Linux系统扫描部件310、文件间依赖关系获得部件320、循环依赖关系去除 部件330、元素间依赖关系图构建部件340的功能和实现可以参考前面结合图1到图7所做 的描述,这里不再赘述。
[0111] 需要说明的是,上述Linux基础软件依赖关系分析装置的各个部件可以用软件程 序来实现,例如通过通用计算机中的CPU结合RAM和ROM等以及其中运行的软件代码来实 现。软件程序可以存储在诸如闪存、软盘、硬盘、光盘等存储介质上,在运行时加载到诸如随 机访问存储器RAM上来由CPU执行。另外,除了通用计算机上,还可以通过专用集成电路和 软件之间的合作来实现。所述集成电路包括通过例如MPU (微处理单元)、DSP (数字信号处 理器)、FPGA(现场可编程门阵列)、ASIC(专用集成电路)等中的至少一个来实现。另外, Linux基础软件依赖关系分析装置的各个部件可以用专门的硬件来实现,例如特定的现场 可编程门阵列、专用集成电路等。另外,图像编码器的各个部件也可以利用软件和硬件的结 合来实现。
[0112] 上述Linux基础软件依赖关系分析装置中的各个单元的结构和数量不对本发明 的范围构成限制。根据本发明的一个实施例,各个部件可以合并为一个独立的部件来执行 和实现相应的功能和操作,或者各个部件进一步拆分为更小的单元来实现他们各自的功能 和操作。
[0113] 以上已经描述了本发明的各实施例,上述说明是示例性的,并非穷尽性的,并且也 不限于所披露的各实施例。在不偏离所说明的各实施例的范围和精神的情况下,对于本技 术领域的普通技术人员来说许多修改和变更都是显而易见的。因此,本发明的保护范围应 该以权利要求的保护范围为准。
【权利要求】
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 = 〇. ..M-1,其中Μ表示整个系统中没有重叠的循环依赖链个 数,Μ为大于等于1的正整数; 步骤3-3 :将其他不存在于任何一个循环依赖链中的二进制文件记为只有一个元素的 集合Xj,j = M. . . Μ+Ν-1,Ν表示系统中不在任何一个循环依赖链中的二进制文件个数,Ν为 大于等于1的正整数;以及 步骤3-4 :由所有的Xi和Xj构成所述集合{X},该集合{X}的大小为Ν+Μ。
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值初始化为 〇 ; 步骤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 = 〇. . . M-1,M表示整个系统中 没有重叠的循环依赖链个数;其他不存在于任何一个循环依赖链中的二进制文件被记为只 有一个元素的集合Xj,j = M. . . M+N-l,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值初始化为 〇 ; 步骤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系统中的重要程度,被直 接依赖和间接依赖总次数越多的元素,其重要性越强。
10.根据权利要求9的Linux基础软件依赖关系分析方法,所述步骤2的逐个分析每个 二进制文件的函数调用关系,获得该文件所依赖的其他二进制文件的集合包括下述操作中 的至少一种: 利用ldd命令分析库调用的依赖关系;以及 利用readelf工具分析二进制可执行文件或库的依赖性。
【文档编号】G06F17/30GK104063220SQ201410291217
【公开日】2014年9月24日 申请日期:2014年6月25日 优先权日:2014年6月25日
【发明者】陶品, 冯立新 申请人:清华大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1