2009-10-13 14 views
5

我有一个C++库,它可以生成更大的代码,我真正期待它的功能。从少于50K行的源代码中,我得到几乎4MB的共享对象和9个静态存档。这是有问题的,因为库的二进制文件非常大,而且更糟糕的是,甚至连接它的简单应用程序通常也会增加500到1000 KB代码大小。用像-Os这样的标志来编译这个库会有所帮助,但并不是非常有用。什么是用于在C/C++应用程序中分析过多代码大小的一些技术或工具?

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

是否有一些工具可以很容易地分析代码的大小,或者我可以找出占用这么多空间的东西,或者更普遍的是,我应该尝试其他任何东西?在Linux下工作的东西将是理想的,但我会尽我所能。

回答

7

如果你想知道你的可执行文件是什么,请问你的工具。打开ld链接器的--print-map(或-M)选项以生成一个映射文件,其中显示了它在内存中的位置以及位置。为静态链接的例子做这些可能会提供更多的信息。

如果您不是直接调用ld,而只是通过gcc命令行,那么您可以通过将它们与-Wl,作为前缀,将gd命令行中的ld特定选项传递给ld。

+0

它不是'-W1',它是'-Wl' – 2009-10-13 19:07:36

+0

@FX - 感谢您的发现。我修复了它。 – 2009-10-13 20:42:00

1

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

2

在Linux上,链接器当然会合并多个模板实例。

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

减少最终二进制大小的一种技术是编译-ffunction-sections-fdata-sections,然后链接-Wl,--gc-sections

甚至更​​大的减少(我们已经看到25%),如果你使用的[gold][1]开发版本(新ELF-只连接器,binutils的一部分),并链接与-Wl,--icf

另一个有用的技术是可能的减少由共享库“导出”的一组符号(所有内容默认都会导出),可以通过__attribute__((visibility(...)))或使用链接描述文件。详细信息here(请参阅“导出控件”)。

相关问题