如何找到链接中的瓶颈?

how to find the bottleneck in linking?

我有一个链接速度很慢的项目(~ 2 分钟,我觉得这很慢)。 我知道 gold 或 lld 等更快的链接器,但我无法更改链接器。

我在我的代码中使用了很多 C++11 模板,我怀疑某些模板代码可能会在多个目标文件中重复实例化,但我不知道如何确定这是否属实。

我想知道是否有一种方法可以分析整个链接阶段,就像我们分析程序并尝试找到瓶颈一样。例如,我使用的工具可以用来检查一个符号(不必要地)出现在不同目标文件中的次数,然后在链接过程中被丢弃可以帮助我找出可能是哪个模板代码的原因。上面关于目标文件中重复符号的问题只是我的推测 - 我需要一个基于证据的方法。 然后基于这个发现,我会考虑如何改进我的代码以减少链接时间。

我使用 CMake、GNU g++ 和 ld 作为我的构建工具,我在 Linux 平台上工作。

谢谢。

解决此问题的一种方法是使用 nm --demangle --defined-only --extern-only 转储 link 中包含的每个目标文件和存档的已定义符号,并构建映射 {symbol, definition_count}。按 definition_count high-to-low 排序此映射并打印。