如何确定最快的链接顺序?(How do I determine the fastest link o

2019-08-02 16:47发布

我有大约50个不同的静态库被链接到我的C ++项目和连接平均需要70。

我发现,与库的链接顺序走动改变了这一时间。 这是预期我想如果链接没有继续寻找在整个已建成高达该点的整个符号表一组符号。

我想我可以用“纳米”来获得静态库之间的依赖关系图。 然而,这只是给我一个“正确”的链接顺序。 什么是参与获取最快的连接顺序的因素是什么?

我得到的,这将有一些通过获取遍历,将尽量减少一些量做上述依赖图的感觉,但我真的不知道哪。

任何帮助,将不胜感激。

我主要使用英特尔编译器,也是gcc编译器飘飞。 他们都似乎是使用GNU ld的链接,当我与顶级检查。 希望这可以帮助...

所以,我只想澄清一点更多的什么,我想请问一下,我已经知道了如何从一组静态库中取得了1通排序。 我写这个剧本自己,但如下奥拉夫的回答表明,有做这个著名的工具。

我的问题是,我已经有两个1通链接排序其中一个运行在〜85S和70〜另一个运行。 所以很明显,还有一些更多的优化,我们可以在1通订单做。

Answer 1:

作为替代,为什么不尝试编译你的库共享库,而不是静态库?

我工作的地方,一个大项目链接时间为6分钟左右,这是只有5库!

我的解决办法(对于调试版本),按字母顺序创建.so文件(libA.so,libB.so等),所以每个蹦床网上单人联系是不会太长,最后一环是要短得多,因为所有的(部分)连接之前已经完成。 发行版本始建于老式的方式,因为人们认为有“危险”与我的新方法。

我设法得到一个1个模块编译/链接周期从6分钟下降到使用此方法10秒。



Answer 2:

在过去,在静态库对象的顺序很重要。 您可以相应的对象与排序:

$ Lorder *的.o | 那样的

也许你可以做同样的你的主要对象和库,如lorder main.o test.o libsome.a libthing.a | tsort lorder main.o test.o libsome.a libthing.a | tsort 。 看看男人lorder



Answer 3:

基于信息比较LD黄金 ,LD的速度是由符号表有多大的影响。 作为符号表从处理对象文件的增长,较慢的链接步骤变得越大。 所以,如果你有两个不同的单通路的连接顺序,即把图书馆带符号的数较多的一个版本,且顺序应该链接更快修正内容。 你应该能够修改一个拓扑排序,包括在排序标准符号计数。



Answer 4:

你说基于对象和库的顺序一通排序的,但如果它通过搜索静态库它不能保证静态库中任何事情都会被在任何特定的顺序,实际上你只能控制该通过订购静态库以某种方式,当你ar它。

此外,不理解链接器如何利用静态librar的(Y | IES),即可以作出最好的两个假设条件是:

  1. 它创建符号的哈希表引用该提供或需要它们的对象(一个或多个); 如果这是一个正确的假设,那么最好的下界,你可以得到一个静态库是需要填充这样一个哈希表,并从中读取时间。
  2. 它盲目地基于在档案中的指数给定的顺序对存档读取。

作为一种尝试,以找到您最佳链路时间的下限,尝试连接所有或存档(S)作为重定位对象的对象的子集; 该子集,如果可能的话识别实际上链接的所有对象。

对于该名男子页lorder表明你可以得到相同的结果ar ts <archive> ...这将打印顺序列表你。 对于该名男子页ar似乎表明运行ars标志会自动储存在档案中的索引优化排序。

此外,要知道有可能是循环依赖,但如果你已经有搞砸tsort你应该已经知晓的已经。

最后,我将离开你最后一条信息。 你想要什么东西是可以解决的NP完全问题。 祝好运。


我一直在运行一些时间测试的最后一个小而构建,我的工作; 我已经在加s标志我ARFLAGS ,看看它有什么作用。

总体而言,它似乎已经增加了我的编译时间,但我相信有为什么一个合乎逻辑的解释:

  • 大部分的可执行文件/共享对象不使用静态链接
  • 它的建设各个静态库的PIC和非PIC版本

如果我们正在重得多使用静态库,我们很可能看到这样一个好处。



文章来源: How do I determine the fastest link order?