CN109918074B - 编译链接优化方法 - Google Patents
编译链接优化方法 Download PDFInfo
- Publication number
- CN109918074B CN109918074B CN201711294532.0A CN201711294532A CN109918074B CN 109918074 B CN109918074 B CN 109918074B CN 201711294532 A CN201711294532 A CN 201711294532A CN 109918074 B CN109918074 B CN 109918074B
- Authority
- CN
- China
- Prior art keywords
- sym
- key
- symbol
- function
- marked
- 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
Links
Images
Landscapes
- Devices For Executing Special Programs (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明涉及一种编译链接优化方法,其利用GNU开源编译链接工具BINUTILS的链接器LD的地址空间分配功能、符号决议功能以及重定位功能,对链接器的链接功能进行优化,并且,优化的功能包括符号表建立功能、查找功能以及链接过程中的查询功能。本发明提供的编译链接优化方法,克服了编译链接速度慢的缺陷,可降低链接时内存占用率,从而达到提升编译链接速度、节省时间成本、提高生产效率的目的。
Description
技术领域
本发明涉及计算机软件程序运行技术领域,具体涉及一种编译链接优化方法。
背景技术
GNU工具链在Linux***中的作用重大,编译链接占有重要比例。近些年,Linux***迅速发展,随着计算机技术的不断发展,越来越多的个人和企业开始大量使用Linux***,各种应用程序的种类不断增加,程序功能不断发生变化,变的愈加多样和复杂,这样的现象导致了程序代码量的急剧增加和模块的增加,同时也给程序的编译链接带来了极大的负担。编译集成过程中,模块的增加导致了二进制目标文件的增加,直接导致需要链接的符号大量增加,这样的数量级将会占用大量***资源,严重拖慢***的运行速度,所以将引入一种大数据的查询处理方式,以解决链接带来的问题。
原有的链接器使用了hash算法。hash算法就是将任一给定长度的数据(字符或数值等)通过给定函数映射为较短的、固定长度的数值,这个数值被称为hash值,这个数值便作为索引。hash表是通过给定的hash函数H(key)和处理冲突方法将一组关键字映射到一个已申请好的内存空间上,H(key)作为给定关键字在内存空间中的存储位置,这部分内存空间被称为hash表或散列,所得存储位置称为hash地址或散列地址。作为线性数据结构与表格和队列等相比,hash表无疑是查找速度比较快的一种。
整个链接过程中,符号表的建立、查找部分最为耗时,主要在于对符号表的建立、查找定位方面的消耗,数量稍小一点的目标文件无法察觉到这方面的消耗,但是如果面临上百个目标文件的链接,而每个目标文件又包括上百个(不止)需要链接的符号时,这样的数量级将会暴露龙芯平台硬件方面的不足。如果在这样的数量级或更高的数量级下继续使用链接器现有的hash算法,将会暴露hash算法的重要缺陷,就是空间效率低下,也就是说当在更高数量级的情况下,将会产生hash冲突,为解决hash冲突,就要开拓更多的内存;链接器现在使用的hash算法将占用更大的内存,在此期间对***速度影响非常大,极易导致***卡顿,链接导致的***资源被大量占用对***的影响已经不容忽视。
发明内容
为解决现有技术存在的不足,本发明提供了一种编译链接优化方法,利用GNU开源编译链接工具BINUTILS的链接器LD的地址空间分配功能、符号决议功能以及重定位功能,对链接器的链接功能进行优化,并且,优化的功能包括符号表建立功能、查找功能以及链接过程中的查询功能。
其中,所述符号表建立功能的优化为创建GL_KV符号表。
其中,符号表建立功能的优化中,通过下述步骤创建GL_KV符号表:
步骤S1:分别收集GNU库符号和基本图形库符号;
步骤S2:将步骤S1中收集的符号的符号名输入布隆过滤器;
步骤S3:将布隆过滤器的输出作为索引算法的输入,确定符号在符号表中的位置;
步骤S4:将符号信息写入符号表。
其中,还包括:
步骤S5:如果经索引算法计算后发现有重复,则另填一张表存放数据,是否重复由GL_KV_sym->rep->sym_r确定;
所述步骤S3中,索引算法为Hash索引算法;
并且,所述步骤S3-步骤S4中,布隆过滤器通过多个hash函数得出了多个值,以这多个值为索引来标记GL_KV位数组,同时以该多个值作为hash索引算法的输入,得出各个符号在GL_KV表中的位置,将符号信息写入GL_KV表中。
其中,所述查找功能的优化,通过下述步骤完成:
步骤SA:建立一个针对GL_KV符号的查询表;
步骤SB:输入sym_key,通过布隆过滤器定位相应的sym_key是否存在于查询表中;
步骤SC:若不存在,则反馈查找失败;若存在,则执行步骤SD;
步骤SD:判断所查找的sym_key是否为flase positive的,若是,则反馈查找失败,若不是,则反馈查找成功。
其中,所述步骤SB中,布隆过滤器由多个hash函数及一个位数组组成,并且,所述步骤SD中,通过GL_KV_sym->sym_key的值来判断所查找的sym_key是否是flase positive。
其中,所述链接过程中的查询功能优化,通过下述步骤完成:
步骤Sa:分别建立一个针对OL_KV符号及GL_KV符号的查询表;
步骤Sb:输入sym_key;
步骤Sc:确定针对OL_KV符号的查询表中是否存在符合要求的经标记的sym_key,若存在,则标记其存在;
步骤Sd:确定针对GL_KV符号的查询表中是否存在符合要求的经标记的sym_key,若存在,也标记其存在;
步骤Se:若经过步骤Sc及步骤Sd,两个查询表中均不存在符合要求的经标记的sym_key,则报错;
若两个查询表中有一个存在标记的sym_key,则使用该sym_key对应的sym_value;
若两个查询表中均存在标记的sym_key,则比较强弱,若两个查询表中的标记的sym_key均为强符号,则报错,若两个查询表中的标记的sym_key有一个为强符号,则选择强符号对应的sym_value。
其中,所述步骤Sc包括:
步骤Sc1:通过布隆过滤器定位相应的sym_key是否存在于针对OL_KV符号的查询表中;若不存在,则执行步骤Sd,若存在,则执行步骤Sc2;
步骤Sc2:判断相应的sym_key是否为flase positive的sym_key,若不是,则标记此sym_key,得到标记的sym_key并执行步骤Sd;若是,则执行步骤Sc3;
步骤Sc3:查询重复数据中是否有此sym_key,若有,则标记此sym_key,得到标记的sym_key并执行步骤Sd;若无,则直接执行步骤Sd。
其中,所述步骤Sd包括:
步骤Sd1:通过布隆过滤器定位相应的sym_key是否存在于针对GL_KV符号的查询表中;若不存在,则执行步骤Se,若存在,则执行步骤Sd2;
步骤Sd2:判断相应的sym_key是否为flase positive的sym_key,若不是,则标记此sym_key,得到标记的sym_key并执行步骤Se;若是,则执行步骤Sd3;
步骤Sd3:查询重复数据中是否有此sym_key,若有,则标记此sym_key,得到标记的sym_key并执行步骤Se;若无,则直接执行步骤Se。
其中,所述步骤Sa中,针对OL_KV符号及GL_KV符号的查询表由多个hash函数及一个位数组组成的布隆过滤器和一个hash索引算法计算得出。
本发明提供的编译链接优化方法,克服了编译链接速度慢的缺陷,可降低链接时内存占用率,从而达到提升编译链接速度、节省时间成本、提高生产效率的目的。
附图说明
图1:本发明的符号建立功能优化实现流程;
图2:本发明的查找功能优化实现流程;
图3:本发明的链接过程中的查询功能优化实现流程。
具体实施方式
为了对本发明的技术方案及有益效果有更进一步的了解,下面结合附图详细说明本发明的技术方案及其产生的有益效果。
本发明的编译链接优化方法,其主要发明构思在于利用GNU开源编译链接工具BINUTILS的链接器LD的地址空间分配、符号决议和重定位等功能,对链接器的链接功能进行优化。将符号建立、查找和重定位功能的算法全部进行改进,舍弃原先普通的hash算法,转而使用布隆过滤器,并将GNU组件的库和基本图形的库所能提供的符号进行维护,全面提升编译链接阶段的速度,以软件方式解决硬件的桎梏。
具体的,如图1-图3所示,分别为本发明的编译链接优化方法所对应的符号建立功能优化、查找功能优化以及链接过程中的查询功能优化的实现流程。
首先,请参阅图1所示,为本发明的符号建立功能优化的实现流程,在进行编译链接优化时,首先使GNU组件维护一个GNU工具链和基本图形库所能提供的最基础的符号表,这个符号表主要有符号名、符号值(地址)、类型、所在文件、同名符号数等,符号作为key,地址作为value,这个表项是对***struct Elfxx_Sym(xx可以是64,也可以是32)这个结构体的一个扩展。这个表目前只作为编译链接使用,所以并不会常驻内存,不需要担心这个表对***会造成什么负担。这个表定名为GL_KV(G:GNU,L:链接器,K:key,V:value),表项为GL_KV_sym,这些数据保存在一个数据文件中。本发明的一实施例中,GL_KV的大致结构如下:
创建GL_KV符号表数据文件的步骤:
(1)分别收集GNU库符号和基本图形库符号;
(2)将上述收集的符号集中的符号名作为布隆过滤器的输入;
(3)将布隆过滤器的输出作为索引算法的输入,确定符号在数据文件中的位置;
(4)将符号信息写入符号表中;
(5)如果有索引算法后发现有重复,则另建立一张表存放数据,是否有重复则由GL_KV_sym->rep->sym_r确定。
然后,请参阅图2所示,为本发明的查找功能优化的实现流程,查找功能优化中,用n个hash函数和一个位数组组成一个查询表,这个查询表(就是这个位数组)专门针对于GL_KV这个表,用于对GL_KV这个表进行查询操作;使用布隆过滤器可以迅速定位sym_key相对应的sym_value是否存在,并使用hash[0](...),...,hash[n-1](...)作为索引算法的因子,迅速确定sym_value的值。其中,考虑到布隆过滤器的使用将带来的“false positive”的结果,这样的概率虽然非常的小,但是对于链接过程,这样的错误却是非常的致命,所以结果则由GL_KV_sym->sym_key的值(如下述代码所示)来判断是否是“false positive”的sym_value,这样既消除了布隆过滤器“false positive”所带来的影响,也保证了布隆过滤器在链接过程中使用方面的正确性。
if(Del_FP(Get_S_K(key),Get_S_K(gl_sym_key)))
goto F_Positon;
else{
...
}
最后,请参阅图3所示,为本发明的链接过程中的查询功能优化的实现流程,在进行链接的过程中,动辄几百个目标文件的链接也采取相同的方式进行查询,首先建立一张OL_KV(O:目标文件,L:链接)的表(如下代码所示)。
使用n个hash函数和一个位数组组成一个查询表专门针对于OL_KV,用于对OL_KV表进行查询操作,使用hash[0](...),...,hash[n-1](...)作为索引算法的因子,确定sym_value的值,完成对符号的重定位及地址的修正。为了避免布隆过滤器带来的“falsepositive”造成的影响,使用OL_KV->sym_key来保证正确性。建立表时,就对同名符号进行判定,如果有强弱符号之分,则使用强符号;如果都是弱符号,则统一标记为0,最后显示查找失败;如果都是强符号,则立刻报错,同样显示查找失败。
具体的,在链接过程中,将涉及到许多同名符号。链接时,在对key进行查询的过程中,首先查找OL_KV表,查看是否存在该key,如果存在,将此符号进行标记;然后再查询GL_KV这张表,查询该key是否存在,如果存在,则与OL_KV表中的符号进行比较,哪个是强符号,都是强符号,则报错,其中有一个是强符号,选择强符号;如果GL_KV和OL_KV表中均不存在key,则报错,如果二者中只存在一个key,则使用这个key对应的value。
注:OL_KV的建立方式和GL_KV的建立方式相同
本发明提供的编译链接优化方法,克服了编译链接速度慢的缺陷,可降低链接时内存占用率,从而达到提升编译链接速度、节省时间成本、提高生产效率的目的。
本发明提供的编译链接优化方法,可适用于多种软件平台下的编译链接的优化,尤其适用于龙芯平台下的编译链接。
本发明中,所谓的“链接器”,是指GNU开源编译链接工具BINUTILS的链接器LD,用于将许多目标二进制文件链接成一个可执行二进制文件。
本发明中,所谓的“GNU工具链”,是在每一个大型开放源码项目(包括Linux内核本身)背后默默支撑的力量。它们由一组必要的工具和软件构成,用于编译和调试从最小的工具软件到最复杂的具有Linux内核特征的各种软件。
本发明中,所谓的“hash算法”,又称为散列算法,它是一种单向密码体制,即它是一个从明文到密文的不可逆的映射,只有加密过程,没有解密过程。
本发明中,所谓的“布隆过滤器”,是指一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中,它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难,这样的误识别就被称为false positive。
虽然本发明已利用上述较佳实施例进行说明,然其并非用以限定本发明的保护范围,任何本领域技术人员在不脱离本发明的精神和范围之内,相对上述实施例进行各种变动与修改仍属本发明所保护的范围,因此本发明的保护范围以权利要求书所界定的为准。
Claims (4)
1.一种编译链接优化方法,其特征在于:利用GNU开源编译链接工具BINUTILS的链接器LD的地址空间分配功能、符号决议功能以及重定位功能,对链接器的链接功能进行优化,并且,优化的功能包括符号表建立功能、查找功能以及链接过程中的查询功能;
GNU组件维护一个GNU工具链和基本图形库所能提供的基础的符号表,所述符号表包括符号名、符号值或地址、类型、所在文件、同名符号数,符号作为key,地址作为value,所述符号表的符号名为GL_KV,其中:G:GNU,L:链接器,K:key,V:value,表项为GL_KV_sym,所述符号表建立功能的优化为创建GL_KV符号表,所述创建GL_KV符号表包括以下步骤:
步骤S1:分别收集GNU库符号和基本图形库符号;
步骤S2:将步骤S1中收集的符号的符号名输入布隆过滤器;
步骤S3:将布隆过滤器的输出作为索引算法的输入,确定符号在符号表中的位置;
步骤S4:将符号信息写入符号表;
所述查找功能的优化,通过下述步骤完成:
步骤SA:建立一个针对GL_KV符号的查询表;
步骤SB:输入sym_key,通过布隆过滤器定位相应的sym_key是否存在于查询表中;
步骤SC:若不存在,则反馈查找失败;若存在,则执行步骤SD;
步骤SD:判断所查找的sym_key是否为flase positive的,若是,则反馈查找失败,若不是,则反馈查找成功;
所述链接过程中的查询功能优化,通过下述步骤完成:
步骤Sa:分别建立一个针对OL_KV符号及GL_KV符号的查询表,其中O:目标文件;
步骤Sb:输入sym_key;
步骤Sc:确定针对OL_KV符号的查询表中是否存在符合要求的经标记的sym_key,若存在,则标记其存在;
步骤Sd:确定针对GL_KV符号的查询表中是否存在符合要求的经标记的sym_key,若存在,也标记其存在;
步骤Se:若经过步骤Sc及步骤Sd,两个查询表中均不存在符合要求的经标记的sym_key,则报错;
若两个查询表中有一个存在标记的sym_key,则使用该sym_key对应的sym_value;
若两个查询表中均存在标记的sym_key,则比较强弱,若两个查询表中的标记的sym_key均为强符号,则报错,若两个查询表中的标记的sym_key有一个为强符号,则选择强符号对应的sym_value。
2.如权利要求1所述的编译链接优化方法,其特征在于:所述步骤Sc包括:
步骤Sc1:通过布隆过滤器定位相应的sym_key是否存在于针对OL_KV符号的查询表中;若不存在,则执行步骤Sd,若存在,则执行步骤Sc2;
步骤Sc2:判断相应的sym_key是否为flase positive的sym_key,若不是,则标记此sym_key,得到标记的sym_key并执行步骤Sd;若是,则执行步骤Sc3;
步骤Sc3:查询重复数据中是否有此sym_key,若有,则标记此sym_key,得到标记的sym_key并执行步骤Sd;若无,则直接执行步骤Sd。
3.如权利要求1所述的编译链接优化方法,其特征在于:所述步骤Sd包括:
步骤Sd1:通过布隆过滤器定位相应的sym_key是否存在于针对GL_KV符号的查询表中;若不存在,则执行步骤Se,若存在,则执行步骤Sd2;
步骤Sd2:判断相应的sym_key是否为flase positive的sym_key,若不是,则标记此sym_key,得到标记的sym_key并执行步骤Se;若是,则执行步骤Sd3;
步骤Sd3:查询重复数据中是否有此sym_key,若有,则标记此sym_key,得到标记的sym_key并执行步骤Se;若无,则直接执行步骤Se。
4.如权利要求1所述的编译链接优化方法,其特征在于:所述步骤Sa中,针对OL_KV符号及GL_KV符号的查询表由多个hash函数及一个位数组组成的布隆过滤器和一个hash索引算法计算得出。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711294532.0A CN109918074B (zh) | 2017-12-08 | 2017-12-08 | 编译链接优化方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711294532.0A CN109918074B (zh) | 2017-12-08 | 2017-12-08 | 编译链接优化方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109918074A CN109918074A (zh) | 2019-06-21 |
CN109918074B true CN109918074B (zh) | 2022-09-27 |
Family
ID=66956601
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201711294532.0A Active CN109918074B (zh) | 2017-12-08 | 2017-12-08 | 编译链接优化方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109918074B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111208978B (zh) * | 2019-12-31 | 2023-05-23 | 杭州安恒信息技术股份有限公司 | 以Python为接口C++实现的字符布隆过滤器 |
CN111736816B (zh) * | 2020-07-20 | 2020-11-24 | 华控清交信息科技(北京)有限公司 | 一种编译链接方法、装置和用于编译链接的装置 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH10275088A (ja) * | 1997-03-31 | 1998-10-13 | Hitachi Ltd | リンク最適化方法 |
CN102385524A (zh) * | 2011-12-23 | 2012-03-21 | 浙江大学 | 一种基于混编指令集的编译链指令替换方法 |
CN103034486A (zh) * | 2012-11-28 | 2013-04-10 | 清华大学 | 移动终端操作***基于全***扩展调用图的自动优化方法 |
CN104951290A (zh) * | 2014-03-31 | 2015-09-30 | 国际商业机器公司 | 优化软件的方法和设备 |
CN105320654A (zh) * | 2014-05-28 | 2016-02-10 | 中国科学院深圳先进技术研究院 | 动态布隆过滤器和基于动态布隆过滤器的元素操作方法 |
-
2017
- 2017-12-08 CN CN201711294532.0A patent/CN109918074B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH10275088A (ja) * | 1997-03-31 | 1998-10-13 | Hitachi Ltd | リンク最適化方法 |
CN102385524A (zh) * | 2011-12-23 | 2012-03-21 | 浙江大学 | 一种基于混编指令集的编译链指令替换方法 |
CN103034486A (zh) * | 2012-11-28 | 2013-04-10 | 清华大学 | 移动终端操作***基于全***扩展调用图的自动优化方法 |
CN104951290A (zh) * | 2014-03-31 | 2015-09-30 | 国际商业机器公司 | 优化软件的方法和设备 |
CN105320654A (zh) * | 2014-05-28 | 2016-02-10 | 中国科学院深圳先进技术研究院 | 动态布隆过滤器和基于动态布隆过滤器的元素操作方法 |
Non-Patent Citations (1)
Title |
---|
"龙芯链接后优化器设计与分析";陈瑜等;《计算机研究与发展》;20060911;第43卷(第8期);1450-1456页 * |
Also Published As
Publication number | Publication date |
---|---|
CN109918074A (zh) | 2019-06-21 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9721116B2 (en) | Test sandbox in production systems during productive use | |
US8843502B2 (en) | Sorting a dataset of incrementally received data | |
TWI479341B (zh) | 資訊系統中轉換資料之高處理能力,可靠複寫 | |
US8037450B2 (en) | System and methods for tracing code generation in template engines | |
JP7047228B2 (ja) | データ照会方法、装置、電子機器、可読記憶媒体、及びコンピュータープログラム | |
CN106547644B (zh) | 增量备份方法和设备 | |
US9218394B2 (en) | Reading rows from memory prior to reading rows from secondary storage | |
CN105095287A (zh) | Lsm数据合并排序方法和装置 | |
CN103914483B (zh) | 文件存储方法、装置及文件读取方法、装置 | |
US9953106B2 (en) | Dynamic generation of traversal code for a graph analytics environment | |
US10528328B2 (en) | Learning from input patterns in Programing-By-Example | |
US20160103858A1 (en) | Data management system comprising a trie data structure, integrated circuits and methods therefor | |
CN111078672B (zh) | 数据库的数据对比方法及装置 | |
CN105989015B (zh) | 一种数据库扩容方法和装置以及访问数据库的方法和装置 | |
CN109918074B (zh) | 编译链接优化方法 | |
CN104424256A (zh) | 布隆过滤器生成方法和装置 | |
CN108268596B (zh) | 搜索存储在存储器中的数据的方法和*** | |
WO2018228001A1 (zh) | 电子装置、信息查询控制方法和计算机可读存储介质 | |
CN105930104B (zh) | 数据存储方法和装置 | |
CN105264519A (zh) | 一种列式数据库处理方法及装置 | |
CN106980673A (zh) | 内存数据库表索引更新方法及*** | |
CN104516823A (zh) | 一种数据存储方法和装置 | |
CN106775586B (zh) | 数据排序方法和装置 | |
CN105786478A (zh) | 用于数据处理的方法及设备 | |
CN104090895A (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 |