CN113050948A - 动态库优化方法、装置、设备及存储介质 - Google Patents
动态库优化方法、装置、设备及存储介质 Download PDFInfo
- Publication number
- CN113050948A CN113050948A CN202110301250.9A CN202110301250A CN113050948A CN 113050948 A CN113050948 A CN 113050948A CN 202110301250 A CN202110301250 A CN 202110301250A CN 113050948 A CN113050948 A CN 113050948A
- Authority
- CN
- China
- Prior art keywords
- function
- dynamic library
- file
- redundant
- target
- 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.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本申请提供了一种动态库优化方法、装置、设备及存储介质,其中,该方法包括:将待优化的动态库编译为目标静态库,将目标静态库链接到调用动态库的至少一个目标程序,生成每个目标程序的可执行文件,根据动态库对应的多个函数标识和每个目标程序的可执行文件对应的多个执行函数标识,确定动态库中的冗余函数并从动态库中删除冗余函数。本申请通过对比动态库和以静态链接方式得到的可执行文件对应的函数标识,确定动态库中的冗余函数,大大缩短了冗余函数的搜索时间,并且提高了冗余函数的精准度。
Description
技术领域
本申请涉及计算机技术领域,具体而言,涉及一种动态库优化方法、装置、设备及存储介质。
背景技术
嵌入式设备由于成本控制的原因,内存及闪存空间都是有限的,在版本迭代的过程中,由于动态库中不需要的冗余函数没有及时删除,导致程序体积越来越大,最终由于空间限制无法在嵌入式设备中运行。
相关技术中,需要手动搜索应用程序的代码以确定其调用的函数名称,将动态库中没有被调用的函数认为是冗余函数,然后删除动态库中的冗余函数。
然而,采用手动搜索的方式,费时费力的同时可能会出现遗漏的情况。
发明内容
本申请的目的在于,针对上述现有技术中的不足,提供一种动态库优化方法、装置、设备及存储介质,以解决现有技术中手动搜索费时费力并且可能遗漏的问题。
为实现上述目的,本申请实施例采用的技术方案如下:
第一方面,本申请一实施例提供了一种动态库优化方法,所述方法包括:
将待优化的动态库编译为目标静态库;
将所述目标静态库链接到调用所述动态库的至少一个目标程序,生成每个目标程序的可执行文件;
根据所述动态库对应的多个函数标识和所述每个目标程序的可执行文件对应的多个执行函数标识,确定所述动态库中的冗余函数并从所述动态库中删除所述冗余函数。
在一可选的实施方式中,所述根据所述动态库对应的多个函数标识和所述每个目标程序的可执行文件对应的多个执行函数标识,确定所述动态库中的冗余函数并删除所述冗余函数之前,所述方法还包括:
采用字符串查找工具,获取所述动态库中的多个可打印字符串;
采用函数标识转换工具,将所述多个可打印字符串转换为所述多个函数标识。
在一可选的实施方式中,所述采用函数标识转换工具,将所述多个可打印字符串转换为所述多个函数标识,包括:
采用所述函数标识转换工具,对所述多个可打印字符串进行转换,获取多个转换后的字符串;
若所述多个转换后的字符串中存在与转换前的可打印字符串不同的多个目标字符串,则将所述多个目标字符串作为所述多个函数标识。
在一可选的实施方式中,所述根据所述动态库对应的多个函数标识和所述每个目标程序的可执行文件对应的多个执行函数标识,确定所述动态库中的冗余函数并删除所述冗余函数,包括:
根据所述多个函数标识中,与所述多个执行函数标识不同的函数标识,确定所述冗余函数的标识。
在一可选的实施方式中,所述根据所述多个函数标识中,与所述多个执行函数标识不同的函数标识,确定所述冗余函数的标识,包括:
将所述多个函数标识,存储至第一函数标识文件中;
将所述多个执行函数标识,存储至所述每个目标程序的第二函数标识文件;
根据存在于所述第一函数标识文件、且不存在于所述第二函数标识文件的函数标识,确定所述冗余函数的标识。
在一可选的实施方式中,若所述目标程序为多个,所述根据存在于所述第一函数标识文件、且不存在于所述第二函数标识文件的函数标识,确定所述冗余函数的标识,包括:
将存在于所述第一函数标识文件、且不存在于所述第二函数标识文件的函数标识,存储至所述每个目标程序的第三函数标识文件;
将所述多个目标程序的第三函数标识文件中均存在的函数标识,确定为所述冗余函数的标识。
在一可选的实施方式中,所述从所述动态库中删除所述冗余函数,包括:
将所述冗余函数的标识存储至第四函数标识文件;
根据所述第四函数标识文件,从所述动态库中删除所述冗余函数。
第二方面,本申请另一实施例提供了一种动态库优化装置,所述装置包括:
编译模块,用于将待优化的动态库编译为目标静态库;
处理模块,用于将所述目标静态库链接到调用所述动态库的至少一个目标程序,生成每个目标程序的可执行文件;根据所述动态库对应的多个函数标识和所述每个目标程序的可执行文件对应的多个执行函数标识,确定所述动态库中的冗余函数,从所述动态库中删除所述冗余函数。
在一可选的实施方式中,还包括:
获取模块,用于采用字符串查找工具,获取所述动态库中的多个可打印字符串;
处理模块,还用于采用函数标识转换工具,将所述多个可打印字符串转换为所述多个函数标识。
在一可选的实施方式中,处理模块,具体用于:
采用所述函数标识转换工具,对所述多个可打印字符串进行转换,获取多个转换后的字符串;
若所述多个转换后的字符串中存在与转换前的可打印字符串不同的多个目标字符串,则将所述多个目标字符串作为所述多个函数标识。
在一可选的实施方式中,处理模块,具体用于:
根据所述多个函数标识中,与所述多个执行函数标识不同的函数标识,确定所述冗余函数的标识。
在一可选的实施方式中,处理模块,具体用于:
将所述多个函数标识,存储至第一函数标识文件中;
将所述多个执行函数标识,存储至所述每个目标程序的第二函数标识文件;
根据存在于所述第一函数标识文件、且不存在于所述第二函数标识文件的函数标识,确定所述冗余函数的标识。
在一可选的实施方式中,处理模块,具体用于:
将存在于所述第一函数标识文件、且不存在于所述第二函数标识文件的函数标识,存储至所述每个目标程序的第三函数标识文件;
将所述多个目标程序的第三函数标识文件中均存在的函数标识,确定为所述冗余函数的标识。
在一可选的实施方式中,处理模块,具体用于:
存储模块,用于将所述冗余函数的标识存储至第四函数标识文件;
根据所述第四函数标识文件,从所述动态库中删除所述冗余函数。
第三方面,本申请另一实施例提供了一种嵌入式设备,包括:处理器、存储器和总线,所述存储器存储有所述处理器可执行的计算机程序,当嵌入式设备运行时,所述处理器与所述存储器之间通过总线通信,所述处理器执行所述机器可读指令,以执行如上述第一方面任一项所述的方法。
第四方面,本申请另一实施例提供了一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器运行时执行如上述第一方面任一项所述的方法。
本申请提供了一种动态库优化方法、装置、设备及存储介质,其中,该方法包括:将待优化的动态库编译为目标静态库,将目标静态库链接到调用动态库的至少一个目标程序,生成每个目标程序的可执行文件,根据动态库对应的多个函数标识和每个目标程序的可执行文件对应的多个执行函数标识,确定动态库中的冗余函数并从动态库中删除冗余函数。本申请通过对比动态库和静态库对应的函数标识,确定动态库中的冗余函数,大大缩短了冗余函数的搜索时间,并且提高了确定冗余函数的精准度。
附图说明
为了更清楚地说明本申请实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本申请的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
图1示出了本申请实施例提供的动态库优化方法的流程示意图一;
图2示出了本申请实施例提供的动态库优化方法的流程示意图二;
图3示出了本申请实施例提供的动态库优化方法的流程示意图三;
图4示出了本申请实施例提供的动态库优化方法的流程示意图四;
图5示出了本申请实施例提供的动态库优化装置的结构示意图;
图6示出了本申请实施例提供的嵌入式设备的结构示意图。
具体实施方式
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,应当理解,本申请中附图仅起到说明和描述的目的,并不用于限定本申请的保护范围。另外,应当理解,示意性的附图并未按实物比例绘制。本申请中使用的流程图示出了根据本申请的一些实施例实现的操作。应该理解,流程图的操作可以不按顺序实现,没有逻辑的上下文关系的步骤可以反转顺序或者同时实施。此外,本领域技术人员在本申请内容的指引下,可以向流程图添加一个或多个其他操作,也可以从流程图中移除一个或多个操作。
另外,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本申请实施例的组件可以以各种不同的配置来布置和设计。因此,以下对在附图中提供的本申请的实施例的详细描述并非旨在限制要求保护的本申请的范围,而是仅仅表示本申请的选定实施例。基于本申请的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本申请保护的范围。
需要说明的是,本申请实施例中将会用到术语“包括”,用于指出其后所声明的特征的存在,但并不排除增加其它的特征。
嵌入式设备由于成本控制的原因,内存及闪存空间都是有限的,在版本迭代的过程中,部分函数可能已经不需要了,但是没有及时删掉,导致程序体积越来越大,最终由于空间限制无法在嵌入式设备中运行。因此,对于这一部分代码,需要进行优化。
现有技术中,对于静态库(静态链接库)和应用程序来说,在编译时加上-ffunction-sections、-fdata-sections、-Wl、–gc-sections参数时,编译器不会将未使用的函数链接进可执行文件中,但是对于动态库(动态链接库)来说,需要手动搜索所有应用程序的代码以确定其调用的函数名称,将动态库中没有被调用的函数认为是冗余函数,然后删除动态库中的冗余函数。其中,搜索和删除是两个步骤,通过搜索结果知道哪些是冗余函数,再根据结果删除冗余的函数,例如,库d中有函数d1,d2,d3,程序a,b,c调用库d中的函数d1,d2(即程序a,b,c依赖库d),没有任何程序调用d3,所以d3可以被认为是冗余函数。其中,判断函数d1,d2是否被调用可以直接在程序a,b,c的代码中搜索对应的函数名称,能搜索到就是有调用,搜索不到就是没有调用。
然而,针对动态库来说,该方案需要手动对所有代码进行搜索,费时费力的同时可能会出现遗漏;并且,在冗余函数较少的情况下,大部分时间都是花在搜索并不需要优化的函数上;同时对于部分函数来说,在某个应用程序的代码中搜索不到,但其是该应用程序依赖的函数接口所需要的,直接删除会造成动态库无法编译通过,可见,通过手动搜索的方式还可能会造成误删或漏删的情况。例如,程序a使用了库b的函数b1,同时函数b1使用了库b的函数b2,因为程序a没有直接使用函数b2,所以认为函数b2是冗余函数,把函数b2删掉,就会造成库b无法进行编译。
基于此问题,本申请提供了一种动态库优化方法,通过对比动态库和以静态链接方式得到的可执行文件对应的函数标识,确定动态库中的冗余函数。在本申请中,将搜索冗余函数的过程改为自动化的方式,实现对动态库中冗余函数的自动获取,无需人工搜索代码,大大缩短了冗余函数的搜索时间,并且提高了冗余函数的精准度,一次就能获取到所有冗余函数,不会出现遗漏。
在介绍本申请的技术方案之前,首先对本申请涉及的专业术语进行解释说明:
名字改编(name mangling):编译器通过函数名和其参数类型识别重载函数,为了保证类型安全的连接(type-safe linkage),编译器用参数个数和参数类型对每一个函数标识符进行专门编码,这个过程称为名字改编(name mangling)或名字修饰(namedecoration)。
-function-sections:为源文件中的每个函数生成单独的可执行与可链接格式(Executable and Linkable Format,ELF)节。
-fdata-section:启用或禁用源文件中的每个变量生成一个可执行与可链接格式(Executable and Linkable Format,ELF)节。
-Wl,–gc-sections:指示链接器去掉不用的可执行与可链接格式(Executableand Linkable Format,ELF)节。
strings工具:在对象文件或二进制文件中查找可打印的字符串,包含程序中定义或使用的所有函数名。
c++filt工具:将经过name mangling的函数名还原为原始的函数名。
动态库:又称为共享库,在程序运行的时候进行动态链接,供程序调用。
下面结合几个具体实施例对本申请提供的动态库优化方法进行详细说明。
图1示出了本申请实施例提供的动态库优化方法的流程示意图一,本实施例的执行主体可以为嵌入式设备。如图1所示,该方法可以包括:
S101、将待优化的动态库编译为目标静态库。
S102、将目标静态库链接到调用动态库的至少一个目标程序,生成每个目标程序的可执行文件。
目标静态库在程序编译时会被链接到程序代码中,程序运行时不再需要目标静态库,而动态库在程序编译时,不会被链接到目标代码中,而是在程序运行时被载入,因此在程序运行时还需要动态库的存在。
其中,调用动态库的至少一个目标程序指的是至少一个目标程序的程序代码中存在该动态库中函数的函数名称,也就是,至少一个目标程序在运行时依赖于该动态库。
在本实施例中,为确定待优化的动态库所包含的冗余函数,可以在程序编译时通过修改编译方式,将待优化的动态库编译为目标静态库,同时在程序编译时,可以将目标静态库链接到调用动态库的至少一个目标程序,生成每个目标程序的可执行文件,具体地,在程序编译时,目标静态库的源代码和每个目标程序的代码分别编译为两个对象文件,通过静态链接的方式,可以将目标静态库的对象文件链接到每个目标程序的对象文件中,生成每个目标程序的可执行文件。
需要说明的是,将待优化的动态库编译为目标静态库,并将目标静态库链接到调用动态库的至少一个目标程序,生成每个目标程序的可执行文件的过程中,可以加上静态库编译参数,静态库编译参数可以包括:-ffunction-sections、-fdata-sections、-Wl、–gc-sections参数,这样,编译时不会将未使用的函数链接进可执行文件中,也就是说,每个目标程序的可执行文件中所包含的执行函数为每个目标程序调用的。
S103、根据动态库对应的多个函数标识和每个目标程序的可执行文件对应的多个执行函数标识,确定动态库中的冗余函数并从动态库中删除冗余函数。
其中,动态库对应的多个函数标识指的是动态库所包含的多个函数的函数标识,每个目标程序的可执行文件对应的多个执行函数标识指的是每个目标程序调用目标静态库中的多个执行函数的函数标识,因此,根据动态库对应的多个函数标识和每个目标程序的可执行文件对应的多个执行函数标识,可以确定动态库中没有被所有目标程序调用的函数的函数标识。
在一可选的实施方式中,步骤S103包括:根据多个函数标识中,与多个执行函数标识不同的函数标识,确定冗余函数的标识,也即,动态库对应的多个函数标识包括每个目标程序的可执行文件对应的多个执行函数标识,将动态库对应的多个函数标识中除了多个执行函数标识的函数标识确定为冗余函数的标识,进而确定出动态库中的冗余函数,并从动态库中删除冗余函数。
需要说明的是,函数标识可以为函数名,也可以为任何用于识别函数身份的唯一标识,本实施例函数标识的具体实现不做特别限定。
本实施例的动态库优化方法,将待优化的动态库编译为目标静态库,将目标静态库链接到调用动态库的至少一个目标程序,生成每个目标程序的可执行文件,根据动态库对应的多个函数标识和每个目标程序的可执行文件对应的多个执行函数标识,确定动态库中的冗余函数并从动态库中删除冗余函数。本申请通过对比动态库和以静态链接方式得到的可执行文件中的函数标识,确定动态库中的冗余函数,大大缩短了冗余函数的搜索时间,并且提高了冗余函数的精准度。
在一些情况中,动态库中的多个可打印字符串可以包含所有使用或定义过的函数标识和一些其他字符串,其他字符串可以为程序中使用的字符串常量,例如,程序中要打印“hello world”,strings的结果中会包含“hello world”,或者程序中定义了一个文件的路径名“H:\a.txt”,strings的结果中也会包含“H:\a.txt”。由于编译器的name mangling机制,可打印字符串包含的函数标识是根据动态库对应的函数标识经过特定规则转换得到的。因此,可以使用函数标识转换工具,将可打印字符串转换回原始的函数标识。
下面结合图2实施例进行说明,图2示出了本申请实施例提供的动态库优化方法的流程示意图二,如图2所示,步骤S103之前,该方法还可以包括:
S201、采用字符串查找工具,获取动态库中的多个可打印字符串。
S202、采用函数标识转换工具,将多个可打印字符串转换为多个函数标识。
其中,字符串查找工具可以为strings工具,采用strings工具,获取动态库中的多个可打印字符串,由于编译器的name mangling机制,可打印字符串包含的函数标识是根据动态库对应的函数标识经过特定规则转换得到的,因此获取到动态库中的多个可打印字符串之后,可以采用函数标识转换工具,将多个可打印字符串转换为多个函数标识,其中,函数标识转换工具例如可以为c++filt工具。
在一些情况中,由于多个可打印字符串可以包含所有使用或定义过的函数标识和一些其他字符串,因此还可以从多个可打印字符串中确定其他字符串,只对可打印字符串包含的函数标识进行转换。
在一可选的实施方式中,步骤S202包括:
采用函数标识转换工具,对多个可打印字符串进行转换,获取多个转换后的字符串。
若多个转换后的字符串中存在与转换前的可打印字符串不同的多个目标字符串,则将多个目标字符串作为多个函数标识。
具体地,采用函数标识转换工具,对多个可打印字符串进行转换,获取多个转换后的字符串,若多个转换后的字符串中存在与转换前的可打印字符串不同的多个目标字符串,则将多个目标字符串作为多个函数标识,也即,将多个转换后的字符串中与对应的转换前的可打印字符串相同的字符串,作为其他字符串,与转换前的可打印字符串不同的多个目标字符串则为多个函数标识。
这是因为:可打印字符串包含的函数标识是根据动态库对应的函数标识经过特定规则转换得到的,因此,可以采用函数标识转换工具,将可打印字符串包含的函数标识转换为动态库对应的函数标识,而其他字符串并未经过特定规则的转换,在转换前后保持不变。例如,“_ZNK4Json5ValueixEPKc”经过c++filt工具转换后会输出“Json::Value::operator[](char const*)const”;而“hello”经过c++filt工具转换后还是会输出“hello”,因此,“Json::Value::operator[](char const*)const”为动态库对应的函数标识,“hello”为其他字符串。
本实施例的动态库优化方法,采用字符串查找工具,获取动态库中的多个可打印字符串,采用函数标识转换工具,将多个可打印字符串转换为多个函数标识。通过该方式可以获取动态库对应的多个函数标识,便于后续进行函数标识的对比,以确定冗余函数的标识。
需要说明的是,每个目标程序的可执行文件对应的多个执行函数标识的获取过程,也可以参见图2实施例中动态库对应的多个函数标识的获取过程,在此不再赘述。
在一些情况中,还可以将以文件的方式存储函数标识,下面结合图3进行说明。图3示出了本申请实施例提供的动态库优化方法的流程示意图三,如图3所示,根据多个函数标识中,与多个执行函数标识不同的函数标识,确定冗余函数的标识,包括:
S301、将多个函数标识,存储至第一函数标识文件中。
S302、将多个执行函数标识,存储至每个目标程序的第二函数标识文件。
S303、根据存在于第一函数标识文件、且不存在于第二函数标识文件的函数标识,确定冗余函数的标识。
将动态库对应的多个函数标识存储至第一函数标识文件中,第一函数标识文件中包括动态库对应的多个函数标识;将每个目标程序的可执行文件对应的多个执行函数标识存储至每个目标程序的第二函数标识文件中,每个目标程序的第二函数标识文件中包括每个目标程序的可执行文件对应的多个执行函数标识。
第一函数标识文件中的多个函数标识为动态库所包含的多个函数的函数标识,每个目标程序的第二函数标识文件第二函数标识文件中的多个执行函数标识为每个目标程序调用目标静态库中的多个执行函数的函数标识,因此,可以根据存储于第一函数标识文件、且不存在于第二函数标识文件中的函数标识,确定冗余函数的标识,也就是,若目标程序为一个,则将第一函数标识文件a和目标程序的第二函数标识文件b进行对比,将存在于第一函数标识文件a但不存在于第二函数标识文件b的函数标识作为冗余函数的标识,也即目标程序不会调用的函数的函数标识;若目标程序为多个,则可以按照上述方式确定出每个目标程序的第二函数标识文件b,并对第一函数标识文件a,与每个第二函数标识文件b进行对比,以将存在于第一函数标识文件a、且不存在于所有第二函数标识文件b的函数标识,作为冗余函数的标识。
本实施例的动态库优化方法,将多个函数标识,存储至第一函数标识文件中,将多个执行函数标识,存储至每个目标程序的第二函数标识文件,根据存在于第一函数标识文件、且不存在于第二函数标识文件的函数标识,确定冗余函数的标识。通过函数标识文件的对比,可以确定出冗余函数的标识,一次获取确定所有冗余函数,不会有遗漏,还可以避免误删或漏删。
在一些情况中,动态库可以供多个目标程序同时使用,若目标程序为多个,则可以采用图4实施例提供的一种可能的实施方式确定冗余函数的标识。图4示出了本申请实施例提供的动态库优化方法的流程示意图四,如图4所示,步骤S303可以包括:
S401、将存在于第一函数标识文件、且不存在于第二函数标识文件的函数标识,存储至每个目标程序的第三函数标识文件。
S402、将多个目标程序的第三函数标识文件中均存在的函数标识,确定为冗余函数的标识。
将存储于第一函数标识文件、且不存在于第二函数标识文件的函数标识,存储至每个目标程序的第三函数标识文件,每个目标程序的第三函数标识文件中包括存储于第一函数标识文件、且不存在于每个目标程序的第二函数标识文件的函数标识,也就是,若目标程序为多个,将第一函数标识文件a,和每个目标程序的第二函数标识文件b进行对比,将存在于a文件但是不存在于每个b文件的函数标识存储至每个目标程序的第三函数标识文件c中,每个目标程序的第三函数标识文件c中包含了每个目标程序不会调用的函数的函数标识。
然后将多个目标程序的第三函数标识文件中均存在的函数标识,确定为冗余函数的标识,由于每个目标程序的第三函数标识文件中包含的函数标识为每个目标程序不会调用的函数的函数标识,因此,将多个目标程序的第三函数标识文件中均存在的函数标识,作为冗余函数的标识,即所有目标程序都不会调用的函数的函数标识。
确定出冗余函数的标识之后,还可以从动态库中删除冗余函数,其中,从动态库中删除冗余函数可以包括:
将冗余函数的标识存储至第四函数标识文件。
根据第四函数标识文件,从动态库中删除冗余函数。
将冗余函数的标识存储至第四函数标识文件d,第四函数标识文件d中包括冗余函数的标识,因此可以根据第四函数标识文件d,从动态库中查找到冗余函数,并从动态库中删除冗余函数。当然,还可以将第四函数标识文件进行存储,后续可以通过第四函数标识文件查找删除了哪些函数,避免了直接删除,导致后续无法查找到删除了哪些函数。
本实施例的动态库优化方法,将存在于第一函数标识文件、且不存在于第二函数标识文件的函数标识,存储至每个目标程序的第三函数标识文件,将多个目标程序的第三函数标识文件中均存在的函数标识,确定为冗余函数的标识。通过对比每个文件的函数标识,在每个文件中都出现的函数标识确定为动态库中的冗余函数,一次获取确定所有冗余函数,不会有遗漏,还可以避免误删或漏删。
图5示出了本申请实施例提供的动态库优化装置的结构示意图,动态库优化装置50可以集成在嵌入式设备中。如图5所示,动态库优化装置50包括:
编译模块501,用于将待优化的动态库编译为目标静态库;
处理模块502,用于将所述目标静态库链接到调用所述动态库的至少一个目标程序,生成每个目标程序的可执行文件,根据所述动态库对应的多个函数标识和所述每个目标程序的可执行文件对应的多个执行函数标识,确定所述动态库中的冗余函数并从所述动态库中删除所述冗余函数。
在一可选的实施方式中,还包括:
获取模块503,用于采用字符串查找工具,获取所述动态库中的多个可打印字符串;
处理模块502,还用于采用函数标识转换工具,将所述多个可打印字符串转换为所述多个函数标识。
在一可选的实施方式中,处理模块502,具体用于:
采用所述函数标识转换工具,对所述多个可打印字符串进行转换,获取多个转换后的字符串;
若所述多个转换后的字符串中存在与转换前的可打印字符串不同的多个目标字符串,则将所述多个目标字符串作为所述多个函数标识。
在一可选的实施方式中,处理模块502,具体用于:
根据所述多个函数标识中,与所述多个执行函数标识不同的函数标识,确定所述冗余函数的标识。
在一可选的实施方式中,处理模块502,具体用于:
将所述多个函数标识,存储至第一函数标识文件中;
将所述多个执行函数标识,存储至所述每个目标程序的第二函数标识文件;
根据存在于所述第一函数标识文件、且不存在于所述第二函数标识文件的函数标识,确定所述冗余函数的标识。
在一可选的实施方式中,处理模块502,具体用于:
将存在于所述第一函数标识文件、且不存在于所述第二函数标识文件的函数标识,存储至所述每个目标程序的第三函数标识文件;
将所述多个目标程序的第三函数标识文件中均存在的函数标识,确定为所述冗余函数的标识。
在一可选的实施方式中,处理模块502,具体用于:
存储模块,用于将所述冗余函数的标识存储至第四函数标识文件;
根据所述第四函数标识文件,从所述动态库中删除所述冗余函数。
本实施例的动态库优化装置,实现过程和实现原理可以参见上述方法实施例提供的动态库优化方法,在此不再赘述。
图6示出了本申请实施例提供的嵌入式设备的结构示意图,如图6所示,嵌入式设备60包括:处理器601、存储器602和总线603,所述存储器602存储有所述处理器601可执行的计算机程序,当嵌入式设备60运行时,所述处理器601与所述存储器602之间通过总线603通信,所述处理器601执行所述机器可读指令,以执行上述方法实施例。
本申请实施例还提供了一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行上述方法实施例。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统和装置的具体工作过程,可以参考方法实施例中的对应过程,本申请中不再赘述。在本申请所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,所述模块的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,又例如,多个模块或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些通信接口,装置或模块的间接耦合或通信连接,可以是电性,机械或其它的形式。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,RandomAccess Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
以上仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请的保护范围之内。
Claims (10)
1.一种动态库优化方法,其特征在于,包括:
将待优化的动态库编译为目标静态库;
将所述目标静态库链接到调用所述动态库的至少一个目标程序,生成每个目标程序的可执行文件;
根据所述动态库对应的多个函数标识和所述每个目标程序的可执行文件对应的多个执行函数标识,确定所述动态库中的冗余函数并从所述动态库中删除所述冗余函数。
2.根据权利要求1所述的方法,其特征在于,所述根据所述动态库对应的多个函数标识和所述每个目标程序的可执行文件对应的多个执行函数标识,确定所述动态库中的冗余函数并删除所述冗余函数之前,所述方法还包括:
采用字符串查找工具,获取所述动态库中的多个可打印字符串;
采用函数标识转换工具,将所述多个可打印字符串转换为所述多个函数标识。
3.根据权利要求2所述的方法,其特征在于,所述采用函数标识转换工具,将所述多个可打印字符串转换为所述多个函数标识,包括:
采用所述函数标识转换工具,对所述多个可打印字符串进行转换,获取多个转换后的字符串;
若所述多个转换后的字符串中存在与转换前的可打印字符串不同的多个目标字符串,则将所述多个目标字符串作为所述多个函数标识。
4.根据权利要求1所述的方法,其特征在于,所述根据所述动态库对应的多个函数标识和所述每个目标程序的可执行文件对应的多个执行函数标识,确定所述动态库中的冗余函数并删除所述冗余函数,包括:
根据所述多个函数标识中,与所述多个执行函数标识不同的函数标识,确定所述冗余函数的标识。
5.根据权利要求4所述的方法,其特征在于,所述根据所述多个函数标识中,与所述多个执行函数标识不同的函数标识,确定所述冗余函数的标识,包括:
将所述多个函数标识,存储至第一函数标识文件中;
将所述多个执行函数标识,存储至所述每个目标程序的第二函数标识文件;
根据存在于所述第一函数标识文件、且不存在于所述第二函数标识文件的函数标识,确定所述冗余函数的标识。
6.根据权利要求5所述的方法,其特征在于,若所述目标程序为多个,所述根据存在于所述第一函数标识文件、且不存在于所述第二函数标识文件的函数标识,确定所述冗余函数的标识,包括:
将存在于所述第一函数标识文件、且不存在于所述第二函数标识文件的函数标识,存储至所述每个目标程序的第三函数标识文件;
将所述多个目标程序的第三函数标识文件中均存在的函数标识,确定为所述冗余函数的标识。
7.根据权利要求6所述的方法,其特征在于,所述从所述动态库中删除所述冗余函数,包括:
将所述冗余函数的标识存储至第四函数标识文件;
根据所述第四函数标识文件,从所述动态库中删除所述冗余函数。
8.一种动态库优化装置,其特征在于,包括:
编译模块,用于将待优化的动态库编译为目标静态库;
处理模块,用于将所述目标静态库链接到调用所述动态库的至少一个目标程序,生成每个目标程序的可执行文件,根据所述动态库对应的多个函数标识和所述每个目标程序的可执行文件对应的多个执行函数标识,确定所述动态库中的冗余函数并从所述动态库中删除所述冗余函数。
9.一种嵌入式设备,其特征在于,包括:处理器、存储器和总线,所述存储器存储有所述处理器可执行的计算机程序,当所述嵌入式设备运行时,所述处理器和所述存储器之间通过总线通信,所述处理器执行所述计算机程序,以执行权利要求1-7任一项所述的方法。
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器运行时执行权利要求1-7任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110301250.9A CN113050948B (zh) | 2021-03-22 | 2021-03-22 | 动态库优化方法、装置、设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110301250.9A CN113050948B (zh) | 2021-03-22 | 2021-03-22 | 动态库优化方法、装置、设备及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113050948A true CN113050948A (zh) | 2021-06-29 |
CN113050948B CN113050948B (zh) | 2022-07-19 |
Family
ID=76514578
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110301250.9A Active CN113050948B (zh) | 2021-03-22 | 2021-03-22 | 动态库优化方法、装置、设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113050948B (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113721928A (zh) * | 2021-11-02 | 2021-11-30 | 成都无糖信息技术有限公司 | 一种基于二进制分析的动态库裁剪方法 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20100125837A1 (en) * | 2008-11-14 | 2010-05-20 | Sun Microsystems, Inc. | Redundant exception handling code removal |
CN110489162A (zh) * | 2019-08-02 | 2019-11-22 | 北京字节跳动网络技术有限公司 | 安装包so文件精简方法、装置、介质和设备 |
CN111538506A (zh) * | 2020-04-30 | 2020-08-14 | 烽火通信科技股份有限公司 | 精简可执行文件的方法及系统 |
CN111580824A (zh) * | 2020-03-30 | 2020-08-25 | 北京达佳互联信息技术有限公司 | 程序优化方法、装置及存储介质 |
-
2021
- 2021-03-22 CN CN202110301250.9A patent/CN113050948B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20100125837A1 (en) * | 2008-11-14 | 2010-05-20 | Sun Microsystems, Inc. | Redundant exception handling code removal |
CN110489162A (zh) * | 2019-08-02 | 2019-11-22 | 北京字节跳动网络技术有限公司 | 安装包so文件精简方法、装置、介质和设备 |
CN111580824A (zh) * | 2020-03-30 | 2020-08-25 | 北京达佳互联信息技术有限公司 | 程序优化方法、装置及存储介质 |
CN111538506A (zh) * | 2020-04-30 | 2020-08-14 | 烽火通信科技股份有限公司 | 精简可执行文件的方法及系统 |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113721928A (zh) * | 2021-11-02 | 2021-11-30 | 成都无糖信息技术有限公司 | 一种基于二进制分析的动态库裁剪方法 |
Also Published As
Publication number | Publication date |
---|---|
CN113050948B (zh) | 2022-07-19 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11579856B2 (en) | Multi-chip compatible compiling method and device | |
US8739144B2 (en) | Compiler optimisation like idiom recognition through pattern matching using value numbering | |
CN106547527B (zh) | 一种JavaScript文件构建方法及装置 | |
CN112394942B (zh) | 基于云计算的分布式软件开发编译方法及软件开发平台 | |
US7917899B2 (en) | Program development apparatus, method for developing a program, and a computer program product for executing an application for a program development apparatus | |
CN104536797A (zh) | 一种Java程序预编译方法和预编译器 | |
CN110990019B (zh) | 一种Java类分析方法、装置、存储介质及电子设备 | |
CN109086215B (zh) | 一种嵌入式软件单元测试用例生成方法及系统 | |
JP4638484B2 (ja) | データ処理装置におけるデータ整合性 | |
US9134977B2 (en) | Compiler operation for handling conditional statements | |
CN113296786B (zh) | 数据处理方法、装置、电子设备及存储介质 | |
CN110058861B (zh) | 源码处理方法及装置、存储介质、电子设备 | |
CN106796525A (zh) | 按需加载动态脚本语言代码以减少内存使用 | |
CN112379917A (zh) | 浏览器兼容性提升方法、装置、设备及存储介质 | |
US8230406B2 (en) | Compiler option consistency checking during incremental hardware design language compilation | |
CN112114933A (zh) | 应用程序保护方法、电子设备和存储介质 | |
CN113050948B (zh) | 动态库优化方法、装置、设备及存储介质 | |
CN114153463B (zh) | 基于脚本编译器的管理系统业务功能创建方法及系统 | |
CN111596970B (zh) | 动态库延迟加载方法、装置、设备和存储介质 | |
Rosen | A compiler-building system developed by Brooker and Morris: including a comprehensive discussion of the major features of the system | |
US20090235054A1 (en) | Disassembling an executable binary | |
CN106484375B (zh) | 一种指令块加载方法、软交换设备及系统 | |
CN117008920A (zh) | 引擎系统、请求处理方法、装置、计算机设备及存储介质 | |
KR20080013422A (ko) | 소프트웨어 프로젝트 빌드 방법 | |
CN114706586A (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 |