【问题标题】:What are some techniques or tools for profiling excessive code size in C/C++ applications?有哪些技术或工具可用于分析 C/C++ 应用程序中过多的代码大小?
【发布时间】:2010-12-06 09:45:16
【问题描述】:

我有一个 C++ 库,它可以生成更大的代码,这是我真正期望的。从不到 50K 行的源代码中,我得到几乎 4 MB 的共享对象和推送 9 的静态存档。这是有问题的,因为库二进制文件非常大,而且更糟糕的是,即使是简单的应用程序链接到它通常也会获得 500 到 1000 KB 的代码大小。使用 -Os 之类的标志编译库在一定程度上有所帮助,但不是非常有效。

我还尝试了 GCC 的 -frepo 命令(尽管我看到的所有文档都表明在 Linux collect2 上无论如何都会合并重复的模板)以及对似乎“可能”重复很多的模板进行显式模板实例化,但在任何一种情况下都没有实际效果。当然,我说“可能”是因为与任何类型的分析一样,这样的盲目猜测几乎总是错误的。

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

【问题讨论】:

    标签: c++ linux gcc code-size


    【解决方案1】:

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

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

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

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

    另一个有用的技术是通过__attribute__((visibility(...))) 或使用链接器脚本减少共享库“导出”的符号集(默认情况下所有内容都导出)。详情here(见“出口控制”)。

    【讨论】:

      【解决方案2】:

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

      如果您不直接调用 ld,而仅通过 gcc 命令行调用,则可以通过在 gcc 命令行中将 ld 特定选项传递给 ld,方法是在它们前面加上 -Wl,

      【讨论】:

      • @FX - 感谢您发现这一点。我已经修好了。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2011-07-06
        • 1970-01-01
        • 2010-11-26
        • 2010-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-22
        • 2019-03-28
        相关资源
        最近更新 更多