首页> 中国专利> ELF二进制库文件符号冲突检测方法、系统及介质

ELF二进制库文件符号冲突检测方法、系统及介质

摘要

本发明提供了一种ELF二进制库文件符号冲突检测方法、系统及介质,包括:模块M1:将ELF二进制库文件中每个库的外部符号导出到每个库对应的nm符号文件;模块M2:分析比较各个库nm符号文件中的外部符号是否存在同名冲突,并将结果输出到冲突检测日志文件中;模块M3:查看并分析冲突检测日志文件中记录的信息是否有冲突符号以及对应的库文件和对象文件,当有冲突符号时,则将对应符号所在对象文件删除命令添加到模块M4;模块M4:删除ELF二进制库文件中存在冲突符号的对象文件,直至日志文件中不存在冲突符号信息,得到可发布的ELF二进制库文件。

著录项

  • 公开/公告号CN112925707A

    专利类型发明专利

  • 公开/公告日2021-06-08

    原文格式PDF

  • 申请/专利权人 上海华元创信软件有限公司;

    申请/专利号CN202110210852.3

  • 申请日2021-02-25

  • 分类号G06F11/36(20060101);G06F16/16(20190101);G06F16/18(20190101);

  • 代理机构31334 上海段和段律师事务所;

  • 代理人李佳俊;郭国中

  • 地址 200062 上海市普陀区金沙江路1006号第2幢562室

  • 入库时间 2023-06-19 11:19:16

说明书

技术领域

本发明涉及嵌入式二进制库处理技术领域,具体地,涉及一种ELF二进制库文件符号冲突检测方法、系统及介质,更为具体地,涉及库文件符号冲突检测批处理的实现方法、ELF二进制符号导出的实现方法、库文件符号冲突检测的实现方法、ELF二进制库处理的实现方法。

背景技术

目前,现有的嵌入式系统集成开发环境,在生成可执行程序文件时会链接目标文件、嵌入式操作系统公共库(包含动态库和静态库)以及工具链库(包含C库、C++库、GCC库和数学库)。嵌入式系统会根据需要重新实现一些与C库、C++库、GCC库和数学库中同名的接口符号,且当嵌入式操作系统开发升级、移植第三方库或者工具链库更新后,这些库中可能会包含相同命名的外部符号(可能是全局函数或变量),在静态链接到同名符号时,连接器将报出符号同名冲突错误,或因链接顺序只链接首先找到的符号,而导致未能链接想要包含的函数符号。

现有通用的方法是碰到一个静态链接或动态加载符号冲突,先定位找到同名的符号,再选择删去其中一个符号。这种方法非常花费时间,需要人工手动在各个库里找每个冲突的符号,再选择删去。若通过编译链接测试来发现冲突的符号,则没有链接到的符号就无法检测冲突,这样检查操作繁琐且易遗漏出错,并且,每次升级库后都需要做这项工作,非常影响嵌入式操作系统多平台版本的迭代发布的效率。

专利文献CN(申请号:201910794490.X)公开了一种检测静态库冲突的自动化方法。该发明涉及静态库处理技术领域,尤其是一种检测静态库冲突的自动化方法,其步骤为:(1)单个静态库框架分离,分析库支持的框架,对不同的框架进行文件分离;(2)对需要检测的静态库执行第一步操作,文件分离;(3)对分离出来的文件进行分析,找出冲突的文件;(4)有文件冲突则删除相关冲突文件;(5)静态库分开,进行静态库的合成、输出;(6)合成一个新的静态库,同一个框架的分离文件整合到一起,合成框架库,框架库再合成一个新的静态库,本发明降低了人工操作的出错率,提高了整体解决静态库冲突的工作效率。

专利文献CN101387968B(申请号:200810223622.5)公开了一种解决多图形化识别与验证动态链接库冲突的方法和装置。是一种解决多图形化识别与验证动态链接库GINADLL冲突的方法,包括:当Windows操作系统启动时,主导GINA DLL由Winlogon系统程序加载和运行,而每个从属GINA DLL由其上一级的主导GINA DLL或从属GINA DLL加载和运行.该发明是一种解决多GINA DLL冲突的装置,使得多个GINA DLL能够协同工作而不产生冲突。

专利文献CN111651768A(申请号:202010775313.X)公开了计算机二进制程序的链接库函数名识别方法及装置。该发明提供一种计算机二进制程序的链接库函数名识别方法,包括:收集静态链接库;对收集的静态链接库进行归档整理;将训练好的机器学习模型编写为IDA插件并在IDA中加载使用;IDA接收用户输入的可疑恶意二进制程序,IDA调用所述将训练好的机器学习模型编写的IDA插件进行自动化分析、检测,并将检测结果在IDA界面中显示。根据该发明的方案,便于逆向分析人员针对性分析未知的恶意软件功能函数;能够在静态链接库不充分的情况下,由训练好的机器学习模型主动辨别静态链接库函数和恶意程序的功能函数,能够提高静态链接库函数识别的准确率,避免攻击者恶意构造与静态库函数签名一致的恶意函数而无法识别恶意程序。

专利文献CN111628848A(申请号:202010400293.8)公开了通信符号的检测方法、设备及计算机可读存储介质。当侦测到通信符号时,根据与所述通信符号对应的传输信道在预设基扩展模型上的函数表示,对所述通信符号进行滤波,得到滤波信号;确定所述滤波信号在预设信号分类上的概率分布,并根据所述概率分布,确定所述通信符号的对数似然比;根据所述对数似然比,确定所述通信符号的类型,完成对所述通信符号的检测。本发明实现了从信道表示和滤波处理等方面来提升符号检测的准确性,提高了检测性能。

综上,现有检测库冲突的方法有的只针对静态库或动态库,有的只对比文件冲突,未考虑到不同属性的函数与变量符号;有的利用链接Windows DLL的属性特点,无法适用于多体系架构的嵌入式系统平台;有的提取到二进制库文件函数名用于信息安全防护。而现有符号冲突检测方法未应用到ELF二进制库文件符号检测中。现有人工手动检查方法效率低下,且无法保证完整性。本发明提供了一种针对嵌入式系统ELF二进制静态库或动态库的符号冲突检测及解决冲突的工具,可自动全面检查各种库的符号冲突,清理重复冲突符号文件,节省人力与时间,提升嵌入式系统第三方库和工具链库的有效性与可用性,方便嵌入式系统在X86、ARM、MIPS、PPC等多平台版本的迭代发布。

针对上述现有技术中的缺陷,本发明要解决的技术问题体现在以下几点:

1)手动检查同名外部符号冲突,费时费力且有可能遗漏,无法保证完整性;

2)提升嵌入式系统工具链库(包含C库、C++库、GCC库和数学库)的有效可用性。

3)由于嵌入式操作系统升级、移植第三方库或者工具链库更新后引起的符号冲突问题,需提升嵌入式操作系统多平台版本的迭代发布效率。

发明内容

针对现有技术中的缺陷,本发明的目的是提供一种ELF二进制库文件符号冲突检测方法、系统及介质。

根据本发明提供的一种ELF二进制库文件符号冲突检测系统,包括:

模块M1:将ELF二进制库文件中每个库的外部符号导出到每个库对应的nm符号文件;

模块M2:分析比较各个库nm符号文件中的外部符号是否存在同名冲突,并将结果输出到冲突检测日志文件中;

模块M3:查看并分析冲突检测日志文件中记录的信息是否有冲突符号以及对应的库文件和对象文件,当有冲突符号时,则将对应符号所在对象文件删除命令添加到模块M4;

模块M4:删除ELF二进制库文件中存在冲突符号的对象文件,直至日志文件中不存在冲突符号信息,得到可发布的ELF二进制库文件。

优选地,所述ELF二进制库文件包括嵌入式操作系统公共库和工具链库;

所述工具链库包括C库、C++库、GCC库和数学库。

优选地,还包括:在模块M2中指定嵌入式软件集成开发环境的根目录、工具链目录和开发平台信息,基于指定的嵌入式软件集成开发环境根目录、工具链目录和开发平台信息实现ELF二进制库文件符号冲突检测。

优选地,所述模块M2包括:

模块M2.1:依次读取nm符号文件中的对象文件名及符号名,并根据已定义符号类型和未定义符号类型分别存放在lib_list链表中;

模块M2.2:遍历检查各个库中的符号名与已定义符号链表中符号名的符号类型是否相同;当符号名相同但符号类型不同且符号类型不是初始化的数据时,则将冲突符号名和对应的对象文件名及库文件名重定向输出到日志文件中;否则,则退出符号检测。

根据本发明提供的一种ELF二进制库文件符号冲突检测方法,包括:

步骤S1:通过二进制符号工具模块将ELF二进制库文件中每个库的外部符号导出到每个库对应的nm符号文件;

步骤S2:导出库符号批处理模块调用符号冲突检测程序模块分析比较各个库nm符号文件中的外部符号是否存在同名冲突,并将结果输出到冲突检测日志文件中;

步骤S3:查看并分析冲突检测日志文件中记录的信息是否有冲突符号以及对应的库文件和对象文件,当有冲突符号时,则将对应符号所在对象文件删除命令添加到删除库符号批处理模块;

步骤S4:删除库符号批处理模块通过二进制库模块删除ELF二进制库文件中存在冲突符号的对象文件;重复执行步骤S2至步骤S4,直至日志文件中不存在冲突符号信息,得到可发布的ELF二进制库文件。

优选地,所述ELF二进制库文件包括嵌入式操作系统公共库和工具链库;

所述工具链库包括C库、C++库、GCC库和数学库。

优选地,还包括:在导出库符号批处理模块中指定嵌入式软件集成开发环境的根目录、工具链目录和开发平台信息,基于指定的嵌入式软件集成开发环境根目录、工具链目录和开发平台信息实现ELF二进制库文件符号冲突检测。

优选地,所述步骤S2包括:

步骤S2.1:依次读取nm符号文件中的对象文件名及符号名,并根据已定义符号类型和未定义符号类型分别存放在lib_list链表中;

步骤S2.2:遍历检查各个库中的符号名与已定义符号链表中符号名的符号类型是否相同;当符号名相同但符号类型不同且符号类型不是初始化的数据时,则将冲突符号名和对应的对象文件名及库文件名重定向输出到日志文件中;否则,则退出符号检测。

根据本发明提供的一种存储有计算机程序的计算机可读存储介质,所述计算机程序被处理器执行时实现上述所述的方法的步骤。

与现有技术相比,本发明具有如下的有益效果:

1、本发明自动全面地检查各个库的所有外部符号,是否存在同名冲突的外部符号,确保完整且高效;

2、本发明高效地清理重复冲突符号,提升了嵌入式系统工具链库(包含C库、C++库、GCC库和数学库)的有效性与可用性;

3、本发明解决了嵌入式操作系统升级、移植第三方库或者工具链库更新后的冲突符号问题,方便嵌入式操作系统在X86、ARM、MIPS、PPC等多平台版本的迭代发布。

附图说明

通过阅读参照以下附图对非限制性实施例所作的详细描述,本发明的其它特征、目的和优点将会变得更明显:

图1为华元锐华嵌入式系统ELF二进制库文件符号冲突检测工具总体框架;

图2为华元锐华嵌入式系统ELF二进制库文件符号冲突检测工具运行流程图;

图3为autogen-xxx.bat导出库符号批处理脚本流程图;

图4为DelObject-xxx.bat删除库符号批处理脚本的流程图;

图5为libCcomper.exe符号检测工具流程图。

具体实施方式

下面结合具体实施例对本发明进行详细说明。以下实施例将有助于本领域的技术人员进一步理解本发明,但不以任何形式限制本发明。应当指出的是,对本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变化和改进。这些都属于本发明的保护范围。

根据本发明提供的一种ELF二进制库文件符号冲突检测系统,包括:

模块M1:将ELF二进制库文件中每个库的外部符号导出到每个库对应的nm符号文件;

模块M2:分析比较各个库nm符号文件中的外部符号是否存在同名冲突,并将结果输出到冲突检测日志文件中;

模块M3:查看并分析冲突检测日志文件中记录的信息是否有冲突符号以及对应的库文件和对象文件,当有冲突符号时,则将对应符号所在对象文件删除命令添加到模块M4;

模块M4:删除ELF二进制库文件中存在冲突符号的对象文件,直至日志文件中不存在冲突符号信息,得到可发布的ELF二进制库文件。

具体地,所述ELF二进制库文件包括嵌入式操作系统公共库和工具链库;

所述工具链库包括C库、C++库、GCC库和数学库。

具体地,还包括:在模块M2中指定嵌入式软件集成开发环境的根目录、工具链目录和开发平台信息,基于指定的嵌入式软件集成开发环境根目录、工具链目录和开发平台信息实现ELF二进制库文件符号冲突检测。

具体地,所述外部符号包括全局的、静态的、BSS段、弱符号等属性的函数名、变量名等。

具体地,所述模块M2包括:

模块M2.1:依次读取nm符号文件中的对象文件名及符号名,并根据已定义符号类型和未定义符号类型分别存放在lib_list链表中;

模块M2.2:遍历检查各个库中的符号名与已定义符号链表中符号名的符号类型是否相同;当符号名相同但符号类型不同且符号类型不是初始化的数据时,则将冲突符号名和对应的对象文件名及库文件名重定向输出到日志文件中;否则,则退出符号检测

根据本发明提供的一种ELF二进制库文件符号冲突检测方法,包括:

步骤S1:通过二进制符号工具模块将ELF二进制库文件中每个库的外部符号导出到每个库对应的nm符号文件;

步骤S2:导出库符号批处理模块调用符号冲突检测程序模块分析比较各个库nm符号文件中的外部符号是否存在同名冲突,并将结果输出到冲突检测日志文件中;

步骤S3:查看并分析冲突检测日志文件中记录的信息是否有冲突符号以及对应的库文件和对象文件,当有冲突符号时,则将对应符号所在对象文件删除命令添加到删除库符号批处理模块;

步骤S4:删除库符号批处理模块通过二进制库模块删除ELF二进制库文件中存在冲突符号的对象文件;重复执行步骤S2至步骤S4,直至日志文件中不存在冲突符号信息,得到可发布的ELF二进制库文件。

优选地,所述ELF二进制库文件包括嵌入式操作系统公共库和工具链库;

所述工具链库包括C库、C++库、GCC库和数学库。

优选地,还包括:在导出库符号批处理模块中指定嵌入式软件集成开发环境的根目录、工具链目录和开发平台信息,基于指定的嵌入式软件集成开发环境根目录、工具链目录和开发平台信息实现ELF二进制库文件符号冲突检测。

优选地,所述步骤S2包括:

步骤S2.1:依次读取nm符号文件中的对象文件名及符号名,并根据已定义符号类型和未定义符号类型分别存放在lib_list链表中;

步骤S2.2:遍历检查各个库中的符号名与已定义符号链表中符号名的符号类型是否相同;当符号名相同但符号类型不同且符号类型不是初始化的数据时,则将冲突符号名和对应的对象文件名及库文件名重定向输出到日志文件中;否则,则退出符号检测。

根据本发明提供的一种存储有计算机程序的计算机可读存储介质,所述计算机程序被处理器执行时实现上述所述的方法的步骤。

实施例2是实施例1的变化例

本发明的总体框架图如图1所示,其中ELF二进制库文件符号冲突检测工具由符号冲突检测批处理文件、xxx-elf-nm二进制符号工具、libCcomper.exe符号检测工具、xxx-elf-ar二进制库工具组成。符号冲突检测批处理文件包括:autogen-xxx.bat导出库符号批处理脚本和DelObject-xxx.bat删除库符号批处理脚本,xxx-elf-nm二进制符号工具和xxx-elf-ar二进制库工具都是GNU binutils二进制工具集中的常用工具。用户可通过编辑符号冲突检测批处理文件进行ELF二进制库文件符号冲突检测与冲突问题解决。

本发明提供的ELF二进制库文件符号冲突检测工具工作流程,如图2所示。

首先,在autogen-xxx.bat导出库符号批处理脚本中指定锐华集成开发环境REDE的根目录、工具链目录、开发平台等信息,通过xxx-elf-nm二进制符号工具将ELF二进制库文件(嵌入式操作系统公共库以及工具链中的C库、C++库、GCC库和数学库)中的外部符号导出到每个库对应的nm文件。

本领域技术人员可以获取所述锐华集成开发环境REDE,或结合现有技术实现类似开发环境,例如至少可以参考嵌入式软件集成开发环境eclipse实现所述锐华集成开发环境REDE,在此不予赘述。

所述外部符号包括全局的、静态的、BSS段、弱符号等属性的函数名、变量名等。

其次,在autogen-xxx.bat脚本中调用libCcomper.exe符号检测工具分析比较各个库nm符号文件中的外部符号是否存在同名冲突,并将结果输出到冲突检测日志文件。

然后,查看并分析日志文件中记录的信息是否有冲突符号以及对应的库文件和对象文件,若有冲突符号,则将对应符号所在对象文件删除命令添加到DelObject-xxx.bat批处理脚本。脚本通过调用xxx-elf-ar二进制库工具将删除ELF二进制库文件中存在冲突符号的对象文件。

最后,再次调用符号检测工具可执行程序libCcomper.exe,并检查输出日志是否存在冲突符号信息,并删除相应对象文件,直到日志中不存在冲突符号信息,就能得到可发布的ELF二进制库文件。

autogen-xxx.bat导出库符号批处理脚本的实现包括如下步骤,如图3所示:

步骤1:指定锐华集成开发环境REDE的根目录、工具链目录、开发平台等信息;

步骤2:通过xxx-elf-nm二进制符号工具将需要检查的ELF二进制库文件(嵌入式操作系统公共库以及工具链中的C库、C++库、GCC库和数学库)中的外部符号导出到每个库对应的nm文件;

步骤3:调用libCcomper.exe符号检测工具对各个库nm符号文件进行分析比较。

DelObject-xxx.bat删除库符号批处理脚本的实现包括如下步骤,如图4所示:

步骤1:指定锐华集成开发环境REDE的根目录、工具链目录、开发平台等信息;

步骤2:通过xxx-elf-ar二进制库工具删除ELF二进制库文件中存在冲突符号的对象文件;

步骤3:调用autogen-xxx.bat导出库符号批处理脚本。

libCcomper.exe符号检测工具的实现包括如下步骤,如图5所示:

步骤1:重定向输出到日志文件Output.log;

步骤2:依次读取.nm文件中的.o文件名及其符号名,并根据已定义符号类型和未定义符号类型分别存放在lib_list链表中;

步骤3:遍历检查各个.a库中符号名是否存在与已定义符号链表中相同的定义符号;

步骤4:当符号名相同且符号类型不相同且符号类型不是“C”(Common未初始化的数据)时,则跳到步骤5,否则跳到步骤6。

步骤5:将冲突符号名和对应所包含的.o对象文件与.a库文件名输出到日志中;

步骤6:退出符号检测。

以上对本发明的具体实施例进行了描述。需要理解的是,本发明并不局限于上述特定实施方式,本领域技术人员可以在权利要求的范围内做出各种变化或修改,这并不影响本发明的实质内容。在不冲突的情况下,本申请的实施例和实施例中的特征可以任意相互组合。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号