【发布时间】:2012-11-02 06:33:51
【问题描述】:
我有大约 50 个不同的静态库链接到我的 c++ 项目中,链接平均需要 70 秒。
我发现这次库的链接顺序发生了变化。这是可以预料的,我猜如果链接器不必在它建立的整个符号表中继续搜索一组符号。
我想我可以使用“nm”来获得静态库之间的依赖关系图。但是,这只会给我一个“正确”的链接顺序。获得最快的链接顺序会涉及哪些因素?
我感觉它与上述依赖关系图有关,方法是通过遍历尝试最小化一些数量,但我真的不确定是哪个。
任何帮助将不胜感激。
我主要使用 intel 编译器和 gcc 编译器。当我用 top 检查它时,它们似乎都在使用 GNU ld 链接器。希望这会有所帮助...
所以只是为了澄清一下我想问的问题,我已经知道如何从一组静态库中获得 1-pass ordering。我自己编写了这个脚本,但正如奥拉夫在下面的回答所暗示的那样,有一些众所周知的工具可以做到这一点。
我的问题是,我已经有两个 1-pass 链接排序,其中一个在 ~85 秒内运行,另一个在 ~70 秒内运行。很明显,我们仍然可以在 1-pass 订单中进行更多优化。
【问题讨论】:
-
可能是符号/未解析符号的列表,但这更像是一种预感而不是知识。旁注:您必须说明您对哪个链接器感兴趣,因为不同的链接器具有完全不同的行为(例如,ibm 对库列表进行多次迭代,直到它解决所有问题或取得进展)
-
我确实声明我正在使用 intel 编译器套件,所以它会是 ld(至少当我检查 top 时它似乎正在运行 ld)。我也时不时使用 gcc 编译器套件,所以这也是 ld。
-
只是一个粗略的想法:编写一个脚本来排列库的所有可能顺序并以编程方式测量链接时间。
-
@g-makulik 我有没有提到我有大约 50 个链接时间约为 70 秒的库?
-
完全不相关的建议,假设您这样做不仅是为了好玩,也是为了钱:将 SSD 作为工作磁盘。这应该比花时间调整链接顺序更能加快链接速度......
标签: c++ performance linker ld