在C / C ++应用程序中分析过多代码大小的一些技术或工具是什么?

时间:2009-10-13 17:09:58

标签: c++ linux gcc code-size

我有一个C ++库,可以生成更大的代码,我真的期望它能做什么。从不到50K的源代码行中,我获得了大约4 MB的共享对象和静态归档推送9.这是有问题的,因为库二进制文件非常大,更糟糕的是,甚至连接它的简单应用程序通常会获得500到1000 KB代码大小。使用像-Os这样的标志编译库有点帮助,但实际上并不是很多。

我还尝试过GCC的-frepo命令(尽管我见过的所有文档都表明Linux上的collect2将合并重复的模板)和模板上的显式模板实例化似乎“很可能”重复,但在任何一种情况下都没有实际效果。当然我说“可能”,因为像任何类型的剖析一样,盲目猜测几乎总是错误的。

是否有一些工具可以轻松地分析代码大小,或者其他一些方法我可以找出占用这么多空间的东西,或者更一般地说,我应该尝试的其他任何东西?在Linux下工作的东西是理想的,但我会采取我能得到的东西。

3 个答案:

答案 0 :(得分:7)

如果您想了解可执行文件中的内容,请询问您的工具。打开ld链接器的--print-map(或-M)选项以生成一个映射文件,显示它放在内存中的位置和位置。为静态链接示例执行此操作可能会提供更多信息。

如果你没有直接调用ld,只能通过gcc命令行调用ld,你可以通过在{1}}之前将ld特定选项从gcc命令行传递给ld。

答案 1 :(得分:2)

在Linux上,链接器肯定会合并多个模板实例化。

确保您没有测量调试二进制文件(调试信息占用的最终二进制文件大小超过75%)。

减少最终二进制文件大小的一种方法是使用-ffunction-sections-fdata-sections进行编译,然后与-Wl,--gc-sections链接。

如果您使用[gold][1]的开发版本(新的仅限ELF的链接器,binutils的一部分),并且与-Wl,--icf <链接,则可能更大的减少(我们已经看到25%) / p>

另一个有用的技术是减少共享库“导出”的符号集(默认情况下导出所有内容),可以通过__attribute__((visibility(...)))或使用链接描述文件。详情here(参见“出口管制”)。

答案 2 :(得分:1)

一种非常粗糙但非常快速的方法是查看目标文件的大小。并非目标文件中的所有代码都会被编译成最终的二进制文件,因此可能存在一些误报,但它可以给出热点所在位置的良好印象。找到最大的目标文件后,您可以使用objdumpnm等工具深入研究它们。