一种二进制库文件版本兼容性识别方法和装置与流程

文档序号:23101193发布日期:2020-11-27 13:09阅读:172来源:国知局
一种二进制库文件版本兼容性识别方法和装置与流程

本申请涉及计算机通信领域,尤其涉及一种二进制库文件版本兼容性识别方法和装置。



背景技术:

在大规模复杂软件开发过程中,通常会将一个复杂系统中拆分成多个模块,由每个团队独立开发并编译一部分模块得到该模块的二进制库文件,并最终将多个团队编译得到的二进制库文件进行链接,得到可执行文件。

在研发过程中,模块之间会存在公共的依赖关系。比如,公共文件库a为系统中基础数据结构、变量的定义以及基础功能接口,供系统中其它模块使用。模块b引用了公共文件库a、模块c也引用了公共文件库a。然而,公共文件库a可能会被修改,这就使得模块b与模块c所引用的公共文件库a的版本可能会出现不一致的情况,进而使得对引用了公共文件库a的模块b进行编译得到的二进制库文件、以及对引用了公共文件库a的模块c进行编译得到的二进制库文件的版本不兼容,致使模块d将模块b与模块c的二进制库文件链接形成的可执行文件d在执行过程中可能会出错。

因此如何识别对模块编译得到的二进制库文件的版本兼容性就成为亟待解决的问题。



技术实现要素:

有鉴于此,本申请提供一种二进制库文件版本兼容性识别方法和装置,用于识别对子模块编译得到的二进制库文件的版本兼容性。

具体地,本申请是通过如下技术方案实现的:

根据本申请的第一方面,提供一种二进制库文件版本兼容性识别方法,所述方法应用于电子设备,包括:

确定父模块的至少一个子模块所引用的公共文件库;

若所述父模块未引用所述公共文件库,则对所述父模块进行编译得到第一二进制库文件、以及检测各子模块对应的第二二进制库文件的符号表中该公共文件库的哈希值是否一致;其中,每一第二二进制库文件是对每一子模块编译得到的;

若一致,则确定各子模块对应的第二二进制库文件版本兼容,并将所述第一二进制库文件、以及各子模块对应的第二二进制库文件进行链接,得到可执行文件。

可选的,所述方法还包括:

若所述父模块引用了所述公共文件库,则计算所述公共文件库的哈希值,以及获取各第二二进制库文件的符号表中该公共文件库的哈希值;

检测计算出的哈希值与获取到的至少一个哈希值是否均一致;

若是,则对所述父模块进行编译得到第一二进制库文件,并确定所述第一二进制库文件与各子模块对应的第二二进制库文件版本兼容,并将第一二进制库文件和各子模块对应的第二二进制库文件进行链接,得到可执行文件。

可选的,第二二进制库文件的符号表中的该公共文件库的哈希值通过如下方式设置:

在对子模块进行编译前,确定该子模块引用的所述公共文件库的哈希值;

对该子模块编译,在编译时将确定出的所述哈希值添加至对所述子模块编译后形成的第二库位文件的符号表中。

可选的,子模块中预设有代表所述公共文件库的全局变量,所述全局变量的名称至少包括:代表所述公共文件库的指定标识;

在所述对该子模块编译前,所述方法还包括:

在预设的makefile文件中设置所述指定标识的取值为所述公共文件库的哈希值;

所述对该子模块编译,以将确定出的所述哈希值添加至对所述子模块编译后形成的第二库位文件的符号表中,包括:

基于所述makefile文件对所述子模块进行编译,以使得该子模块编译得到的第二二进制库文件的符号表中生成代表所述全局变量的符号;所述符号的名称至少包括:所述哈希值。

可选的,所述全局变量的名称还包括:预设魔术字;所述符号的名称还包括:所述预设魔术字;

第二二进制库文件的符号表中该公共文件库的哈希值通过如下方式确定:

在所述第二二进制库文件的符号表中,查找包含有预设魔术字的符号名称;

将查找到的符号名称中包含的哈希值确定为所述公共文件库的哈希值。

根据本申请的第二方面,提供一种二进制库文件版本兼容性识别装置,所述装置应用于电子设备,包括:

确定单元,用于确定父模块的至少一个子模块所引用的公共文件库;

检测单元,用于若所述父模块未引用所述公共文件库,则对所述父模块进行编译得到第一二进制库文件、以及检测各子模块对应的第二二进制库文件的符号表中该公共文件库的哈希值是否一致;其中,每一第二二进制库文件是对每一子模块编译得到的;

识别单元,用于若一致,则确定各子模块对应的第二二进制库文件版本兼容,并将所述第一二进制库文件、以及各子模块对应的第二二进制库文件进行链接,得到可执行文件。

可选的,所述检测单元,还用于若所述父模块引用了所述公共文件库,则计算所述公共文件库的哈希值,以及获取各第二二进制库文件的符号表中该公共文件库的哈希值;检测计算出的哈希值与获取到的至少一个哈希值是否均一致;

所述识别单元,还用于若是,则对所述父模块进行编译得到第一二进制库文件,并确定所述第一二进制库文件与各子模块对应的第二二进制库文件版本兼容,并将第一二进制库文件和各子模块对应的第二二进制库文件进行链接,得到可执行文件。

可选的,所述装置还包括:

设置单元,在设置第二二进制库文件的符号表中的该公共文件库的哈希值时,用于在对子模块进行编译前,确定该子模块引用的所述公共文件库的哈希值;对该子模块编译,在编译时将确定出的所述哈希值添加至对所述子模块编译后形成的第二库位文件的符号表中。

可选的,子模块中预设有代表所述公共文件库的全局变量,所述全局变量的名称至少包括:代表所述公共文件库的指定标识;

所述设置单元,在所述对该子模块编译前,还用于在预设的makefile文件中设置所述指定标识的取值为所述公共文件库的哈希值;

所述设置单元,在对该子模块编译,以将确定出的所述哈希值添加至对所述子模块编译后形成的第二库位文件的符号表中时,用于基于所述makefile文件对所述子模块进行编译,以使得该子模块编译得到的第二二进制库文件的符号表中生成代表所述全局变量的符号;所述符号的名称至少包括:所述哈希值。

可选的,所述全局变量的名称还包括:预设魔术字;所述符号的名称还包括:所述预设魔术字;

所述检测单元,在确定第二二进制库文件的符号表中该公共文件库的哈希值时,用于在所述第二二进制库文件的符号表中,查找包含有预设魔术字的符号名称;将查找到的符号名称中包含的哈希值确定为所述公共文件库的哈希值。

由于在链接前,电子设备通过各二进制库文件中的符号表中的该公共文件库的哈希值是否一致,来确定各二进制库文件的版本是否兼容,在确定各二进制库文件版本兼容时,对各二进制库文件进行链接,得到可执行文件,从而降低可执行文件在执行时的出错率。

附图说明

图1是本申请一示例性实施例示出的一种公共文件库的哈希值的设置方法的流程图;

图2是本申请一示例性实施例示出的一种二进制库文件版本兼容性识别方法的流程图;

图3是本申请一示例性实施例示出的一种电子设备的硬件结构图;

图4是本申请一示例性实施例示出的一种二进制库文件版本兼容性识别装置的框图。

具体实施方式

这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本申请相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本申请的一些方面相一致的装置和方法的例子。

在本申请使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本申请。在本申请和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。

应当理解,尽管在本申请可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本申请范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。

在实际应用中,父模块和子模块所共同引用的公共文件库可被修改,每修改一次,就会为公共文件库赋予一个新的版本号。

比如,初始公共文件库的版本号为v.0,初始公共文件库修改一次后的版本号为v.1。

而公共文件库的版本是由各个团队人工维护的,这就很容易造成父模块、子模块所引用的公共文件库的版本号不一致,这就使得对引用了不同版本的公共文件库的父模块源代码文件、多个子模块源代码文件进行编译得到的父模块二进制库文件、多个子模块的版本不兼容,这使得对这些二进制库文件进行链接得到的可执行文件在执行过程中容易可能会出错。

例如,假设父模块的两个子模块,分别为子模块1和子模块2。假设,子模块1和子模块2的源代码文件均引用了公共文件库a。假设,子模块1和子模块2引用的公共文件库a的版本不同。

电子设备会对父模块源代码文件进行编译,得到父模块的二进制库文件,以及对这两个子模块进行编译,得到子模块1的二进制库文件和子模块2的二进制库文件。

由于子模块1和子模块2引用的公共文件库a的版本不同,所以子模块1的二进制库文件和子模块2的二进制库文件的版本不兼容,这就使得通过对父模块的二进制库文件、子模块1的二进制库文件和子模块2的二进制库文件进行链接得到的可执行文件在执行时可能会出错。

有鉴于此,本申请提供一种二进制版本兼容性识别方法,该方法包括:电子设备确定父模块引用的源代码文件(这里简称为)的至少一个子模块(即子模块的源代码文件)所引用的公共文件库。若所述父模块未引用所述公共文件库,则对所述父模块进行编译得到第一二进制库文件、以及检测各子模块对应的第二二进制库文件的符号表中该公共文件库的哈希值是否一致;其中,每一第二二进制库文件是对每一子模块编译得到的;若一致,则确定各子模块对应的第二二进制库文件版本兼容,并将所述第一二进制库文件、以及各子模块对应的第二二进制库文件进行链接,得到可执行文件。

由于在链接前,电子设备通过确定各二进制库文件中的符号表中的该公共文件库的哈希值是否一致,来确定各二进制库文件的版本是否兼容,在确定各二进制库文件版本兼容时,对各二进制库文件进行链接,得到可执行文件,从而降低可执行文件在执行时的出错率。

在介绍本申请提供的二进制库文件版本兼容性识别方法之前,先对本申请涉及的概念进行详细地说明。

公共文件库:公共文件库提供了基础数据结构、变量的定义、以及基础功能接口等。父模块、子模块都可以引用公共文件库。

二进制库文件:二进制库文件简单来说为一种代码仓库。对源代码文件进行编译,可以得到二进制库文件。

符号表:符号表是一种供编译器用于保存有关源程序构造的各种信息的数据结构,这些信息在编译器的分析阶段被逐步收集并放入符号表。符号表的标识符属性包含符号名、符号的类型、符号的存储类别、符号的作用域及可视性、符号变量的存储分配信息等。在对源代码文件进行编译后,可得到二进制库文件、以及该二进制库文件的符号表。

makefile:makefile文件描述了整个工程中源代码文件的编译、连接等规则,其中包括工程中的哪些源文件需要编译以及如何编译、需要创建哪些库文件以及如何创建这些库文件、如何最后产生可执行文件。makefile文件的好处是能够使用一行命令来完成“自动化编译”,一旦编写一个正确的makefile文件,整个工程完全可以自动编译,极大提高了效率。

在介绍完上述概念后,下面从“公共文件库的哈希值的设置”、以及“二进制库文件版本兼容性识别”两方面,对本申请提供的二进制库文件版本兼容性识别方法进行详细地说明。

一、公共文件库的哈希值的设置

参见图1,图1是本申请一示例性实施例示出的一种公共文件库的哈希值的设置方法的流程图,该方法可应用在电子设备上,可包括如下所示步骤。

步骤101:在对子模块进行编译前,确定该子模块引用的所述公共文件库的哈希值。

其中,需要说明的是,本申请所述的父模块为包含多个源代码文件(比如c文件,c++文件等),子模块为父模块提供接口,父模块可引用子模块。子模块也包含多个源代码文件(比如c文件,c++文件等),下文不再赘述。

在一种可选的实现方式中,在对子模块进行编译前,电子设备可调用公共文件库的哈希值计算算法,计算该子模块所引用的公共文件库的哈希值。

其中,该哈希值可以是对公共文件库进行哈希得到的值,也可以是对公共文件库进行哈希运算得到的值中截取出预设位数的值(比如截取出后6位得到的值)。这里只是对哈希值进行示例性地说明,不对其进行具体地限定。

步骤102:对该子模块编译,在编译时将确定出的所述哈希值添加至对所述子模块编译后形成的第二库位文件的符号表中。

在一种可选的实现方式中,该子模块预设有代表该公共文件库的全局变量,该全局变量的名称至少包括:代表所述公共文件库的指定标识。比如,该指定标识为public_hash。

在计算出公共文件库的哈希值,可将在该子模块对应的makefile(编译清单)文件中设置该指定标识的取值为该公共文件库的哈希值。

然后,电子设备可以基于已设置的makefile文件对子模块进行编译。由于在makefile文件进行上述设置,所以在编译过程中,电子设备会将公共文件库的哈希值赋值给上述指定标识,并在编译后的第二二进制库文件的符号表中生成与该全局变量对应的符号,该符号的名称至少包括该公共文件库的哈希值。

可选的,由于符号表包含了很多机器语言的代码(比如二进制代码),为了方便后续在符号表中查找公共文件库的哈希值,本申请设置了魔术字,通过魔术字在符号表中查找公共文件库的哈希值。

具体地,上述全局变量的名称除了包含代表公共文件库的指定标识,还包括了预设的魔术字。

上述符号表中生成的与全局变量对应的符号名称还包含了预设魔术字。

后续在子模块对应的第二二进制库文件的符号表中查找公共文件库的哈希值时,可查找符号名称包含预设魔术字的符号名称,然后将该符号名称中的哈希值确定为公共文件库的哈希值。

下面通过具体地例子对步骤102进行详细地说明。

在子模块的源代码中进行如下配置:

/*在子模块中定义宏var_connect,var_connect由var1与var2拼接得到*/

#definevar_connect(var1,var2)var1##var2;

/*在子模块中定义宏var_define,var_define可由var_connect得到*/

#definevar_define(var1,var2)var_connect(var1,var2);

/*在子模块中定义全局变量,该全局变量的名称由预设魔术字g_md5_与public_hash(代表公共文件库的指定标识)拼接而成*/

staticintvar_define(g_md5_,public_hash).

以上为子模块中的源代码。

由此可见,子模块中预配置了全局变量,该全局变量的名称由预设魔术字和代表公共文件库的指定标识拼接而成。

电子设备在获取该子模块所引用的公共文件库的哈希值后,可在预设的makefile文件中设置所述指定标识的取值为所述公共文件库的哈希值。

具体地,可通过如下代码实现设置所述指定标识的取值为所述公共文件库的哈希值:

/*在子模块对应的makefile中给指定标识public_hash赋值为公共文件库a的哈希值或者哈希值的一部分(即aac78d)*/

extra_cflags+=-dlinux-d__kernel__-dmodule-o1-g2-pipe-wall-dpublic_hash=aac78d;

以上为设置指定标识的取值为公共文件库的哈希值的代码。

然后,电子设备基于makefile文件对子模块进行编译,在编译过程中电子设备会将公共文件库的哈希值赋值给上述指定标识,并在编译后的第二二进制库文件的符号表中生成与该全局变量对应的符号,该符号的名称由上述预设魔术字和该公共文件库的哈希值拼接而成。

例如,使用objdump命令查询二进制文件b.ko的符号表,并使用grep命令过滤包含魔术字g_md5_的符号:

[root@pc1]$objdump-tb.ko|grepg_md5_

0000000000001c88lo.bss0000000000000004g_md5_aac78d.78393。

以上为查询公共文件库的哈希值的代码。

其中,与全局变量对应的符号的符号名称为g_md5_aac78d,其中,g_md5_是预设魔术字,aac78d是公共文件库的哈希值或者是公共文件库的哈希值的一部分。

二、二进制库文件版本兼容性识别

参见图2,图2是本申请一示例性实施例示出的一种二进制库文件版本兼容性识别方法的流程图,该方法可应用在电子设备上,可包括如下所示步骤。

步骤201:确定父模块引用的至少一个子模块所引用的公共文件库。

步骤202:若所述父模块未引用所述公共文件库,则对所述父模块进行编译得到第一二进制库文件、以及检测各子模块对应的第二二进制库文件的符号表中该公共文件库的哈希值是否一致;其中,每一第二二进制库文件是对每一子模块编译得到的。

步骤203:若一致,则确定各子模块对应的第二二进制库文件版本兼容,并将所述第一二进制库文件、以及各子模块对应的第二二进制库文件进行链接,得到可执行文件。

在实现时,首先电子设备可采用图1所示的方式对子模块进行编译,得到各子模块对应的第二二进制库文件、以及该第二二进制库文件的符号表,第二二进制库文件的符号表中包含了该子模块所引用的公共文件库的哈希值。

在实现步骤201-步骤203时,电子设备可确定父模块引用的至少一个子模块所引用的公共文件库。然后,电子设备可检测父模块是否引用了该公共文件。

1)父模块未引用该公共文件库

在本申请实施例中,若父模块未引用该公共文件库,电子设备可直接对父模块进行编译,得到第一二进制库文件(这里为了方便叙述,将父模块编译得到的二进制库文件称为第一二进制库文件)。

此外,电子设备还可获取各子模块对应的第二二进制库文件,并从各第二二进制库文件中获取各子模块所引用的该公共文件库的哈希值。

在获取该公共文件库的哈希值时,电子设备可采用objdump命令在第二二进制库文件的符号表中,查找包含有上述预设魔术字的符号名称,并获取查找到的符号名称中的哈希值作为该公共文件库的哈希值。

然后,电子设备可检测从各第二二进制库文件的符号表中获取的哈希值是否一致。若从各第二二进制库文件的符号表中获取的哈希值一致,则确定各第二二进制库文件的版本兼容。此时,电子设备可对第一二进制库文件、和各第二二进制库文件进行链接,得到可执行文件。

若从各第二二进制库文件的符号表中获取的哈希值不一致,则发出告警信息,以提示用户各第二二进制库文件版本不兼容。

例如,假设父模块对应的子模块为子模块1和子模块2。

子模块1和子模块2均引用了公共文件库a,但二者引用公共文件库a的版本可能相同也可能不同。父模块未引用公共文件库a。

在父模块未引用公共文件库a的情况下,电子设备可对父模块进行编译得到第一二进制库文件。

此外,电子设备还可获取子模块1对应的第二二进制库文件1的符号表1中的哈希值2。具体地,电子设备可在符号表1中查找包含有预设魔术字的符号名称,并获取该符号名称中的哈希值2。哈希值2表示子模块1引用的公共文件库a的哈希值。哈希值2可通过上述描述的在符号表1中生成。

电子设备还可获取子模块2对应的第二二进制库文件2的符号表2中的哈希值3,哈希值3表示子模块2引用的公共文件库a的哈希值。哈希值3的获取方式与哈希值2的获取方式相同,这里不再赘述。

电子设备可检测哈希值2和哈希值3是否一致。

若哈希值2和哈希值3一致,则确子模块1和子模块2所引用的公共文件库a的版本相同,进而确定第二二进制库文件1和第二二进制库文件2的版本兼容。此时,电子设备可对第一二进制库文件、第二二进制库文件1和第二二进制库文件2进行链接,得到可执行文件。

若哈希值2和哈希值3不一致,则发出告警信息,以提示用户第二二进制库文件1和第二二进制库文件2的版本不兼容。

2)父模块引用了公共文件

在本申请实施例中,若父模块引用了该公共文件库,则电子设备可计算该父模块引用的公共文件库的哈希值。此外,电子设备还可获取该父模块的各子模块分别对应的第二二进制库文件符号表中的该公共文件库的哈希值。

然后,电子设备可检测计算出的哈希值(即父模块引用该公共文件库的哈希值)与获取到的哈希值(即各子模块所引用的该公共文件库的哈希值)是否一致。

若计算出的哈希值与获取到的哈希值一致,则对父模块进行编译得到第一二进制库文件,并确定第一二进制库文件和各第二二进制库文件的版本兼容。此时,电子设备可对第一二进制库文件、各第二二进制库文件进行链接,得到可执行文件。

若计算出的哈希值与获取到的哈希值不一致,则发出告警信息,以提示用户第一二进制库文件和各第二二进制库文件版本不兼容。

例如,假设父模块对应的子模块为子模块1和子模块2。

父模块、子模块1和子模块2均引用了公共文件库a,但三者引用公共文件库a的版本可能相同也可能不同。

在父模块引用了公共文件库a的情况下,电子设备可计算父模块所引用的公共文件库a的哈希值1。

此外,电子设备还可获取子模块1对应的第二二进制库文件1的符号表1中的哈希值2。具体地,电子设备可在符号表1中查找包含有预设魔术字的符号名称,并获取该符号名称中的哈希值2。哈希值2表示子模块1引用的公共文件库a的哈希值。哈希值2可通过上述描述的在符号表1中生成。

电子设备还可获取子模块2对应的第二二进制库文件2的符号表2中的哈希值3,哈希值3表示子模块2引用的公共文件库a的哈希值。哈希值3的获取方式与哈希值2的获取方式相同,这里不再赘述。

电子设备可检测哈希值1、哈希值2和哈希值3是否一致。

若哈希值1、哈希值2和哈希值3一致,则对父模块进行编译得到第一二进制库文件,并确定父模块、子模块1和子模块2所引用的公共文件库a的版本相同,进而确定第一二进制库文件、第二二进制库文件1和第二二进制库文件2的版本兼容。此时,电子设备可对第一二进制库文件、第二二进制库文件1和第二二进制库文件2进行链接,得到可执行文件。

若哈希值1、哈希值2和哈希值3不一致,则发出告警信息,以提示用户第一二进制库文件、第二二进制库文件1和第二二进制库文件2的版本不兼容。

由上述描述可知,一方面,由于在链接前,电子设备通过确定各二进制库文件中的符号表中的该公共文件库的哈希值是否一致,来确定各二进制库文件的版本是否兼容,在确定各二进制库文件版本兼容时,对各二进制库文件进行链接,得到可执行文件,从而降低可执行文件在执行时的出错率。

另一方面,通常识别二进制库文件版本是否兼容的方式是:在子模块中设置全局变量,将子模块引用的公共文件库的哈希值赋值给该全局变量。同时,子模块对外提供一个api接口。在进行二进制文件库版本兼容性识别时,需要先动态加载父模块编译得到的第一二进制库文件以及各子模块编译得到的第二二进制库文件,在加载后调用该api获取全局变量的取值(即公共文件库的哈希值)。然后再检测各子模块引用的公共文件库的哈希值是否一致。

但是,在一个复杂的大型软件运行过程中,动态加载二进制库文件可能会需要特定的cpu型号、特定的网络环境、以及漫长的环境初始化过程,造成该识别方法的通用性较差,以及效率较低。

而在本申请中,电子设备在对文件的编译过程中,将文件所引用的公共文件库的哈希值添加至该文件编译得到的二进制库文件的符号表中,在进行哈希值比对时,可直接从静态的符号表中获取哈希值进行哈希值比较。由于在哈希值比较时,无需动态加载二进制库文件,所以本申请提供的识别方法通用性较高,且识别效率较高。

参见图3,图3是本申请一示例性实施例示出的一种电子设备的硬件结构图。

该电子设备包括:通信接口301、处理器302、机器可读存储介质303和总线304;其中,通信接口301、处理器302和机器可读存储介质303通过总线304完成相互间的通信。处理器302通过读取并执行机器可读存储介质303中与二进制库文件版本兼容性识别控制逻辑对应的机器可执行指令,可执行上文描述的二进制库文件版本兼容性识别方法。

本文中提到的机器可读存储介质303可以是任何电子、磁性、光学或其它物理存储装置,可以包含或存储信息,如可执行指令、数据,等等。例如,机器可读存储介质可以是:易失存储器、非易失性存储器或者类似的存储介质。具体地,机器可读存储介质303可以是ram(radomaccessmemory,随机存取存储器)、闪存、存储驱动器(如硬盘驱动器)、固态硬盘、任何类型的存储盘(如光盘、dvd等),或者类似的存储介质,或者它们的组合。

参见图4,图4是本申请一示例性实施例示出的一种二进制库文件版本兼容性识别装置的框图。该装置可应用在电子设备上,可包括如下所示单元。

确定单元401,用于确定父模块引用的至少一个子模块所引用的公共文件库;

检测单元402,用于若所述父模块未引用所述公共文件库,则对所述父模块进行编译得到第一二进制库文件、以及检测各子模块对应的第二二进制库文件的符号表中该公共文件库的哈希值是否一致;其中,每一第二二进制库文件是对每一子模块编译得到的;

识别单元403,用于若一致,则确定各子模块对应的第二二进制库文件版本兼容,并将所述第一二进制库文件、以及各子模块对应的第二二进制库文件进行链接,得到可执行文件。

可选的,所述检测单元402,还用于若所述父模块引用了所述公共文件库,则计算所述公共文件库的哈希值,以及获取各第二二进制库文件的符号表中该公共文件库的哈希值;检测计算出的哈希值与获取到的至少一个哈希值是否均一致;

所述识别单元403,还用于若是,则对所述父模块进行编译得到第一二进制库文件,并确定所述第一二进制库文件与各子模块对应的第二二进制库文件版本兼容,并将第一二进制库文件和各子模块对应的第二二进制库文件进行链接,得到可执行文件。

可选的,所述装置还包括:

设置单元404,在设置第二二进制库文件的符号表中的该公共文件库的哈希值时,用于在对子模块进行编译前,确定该子模块引用的所述公共文件库的哈希值;对该子模块编译,在编译时将确定出的所述哈希值添加至对所述子模块编译后形成的第二库位文件的符号表中。

可选的,子模块中预设有代表所述公共文件库的全局变量,所述全局变量的名称至少包括:代表所述公共文件库的指定标识;

所述设置单元404,在所述对该子模块编译前,还用于在预设的makefile文件中设置所述指定标识的取值为所述公共文件库的哈希值;

所述设置单元404,在对该子模块编译,以将确定出的所述哈希值添加至对所述子模块编译后形成的第二库位文件的符号表中时,用于基于所述makefile文件对所述子模块进行编译,以使得该子模块编译得到的第二二进制库文件的符号表中生成代表所述全局变量的符号;所述符号的名称至少包括:所述哈希值。

可选的,所述全局变量的名称还包括:预设魔术字;所述符号的名称还包括:所述预设魔术字;

所述检测单元402,在确定第二二进制库文件的符号表中该公共文件库的哈希值时,用于在所述第二二进制库文件的符号表中,查找包含有预设魔术字的符号名称;将查找到的符号名称中包含的哈希值确定为所述公共文件库的哈希值。

上述装置中各个单元的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。

对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本申请方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。

以上所述仅为本申请的较佳实施例而已,并不用以限制本申请,凡在本申请的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本申请保护的范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1