如何找到链接的瓶颈?

时间:2019-07-04 16:00:58

标签: c++ gcc linker ld

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

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

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

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

谢谢。

1 个答案:

答案 0 :(得分:0)

解决此问题的一种方法是转储nm --demangle --defined-only --extern-only链接中包含的每个目标文件和归档的已定义符号,并建立映射{symbol, definition_count}。将此映射按definition_count从高到低排序并打印。