【问题标题】:GCC Linker : how to generate a report of per file contribution on output sectionsGCC Linker:如何在输出部分生成每个文件贡献的报告
【发布时间】:2020-03-26 14:42:33
【问题描述】:

最近我在尝试链接我的程序时遇到了一个问题。它报告.text 无法放入指定的内存区域。显然源代码变得太大而无法在有限的内存区域中链接。

我现在要做的是分析哪个文件对“.text”部分的贡献最大,以便可以执行后续代码优化。我尝试了很多方法,但没有成功。

  • nm -s output.elf 给出每个符号的大小,但不要将符号分组到每个源文件下。
  • nm -s file.obj 遍历每个目标文件不起作用,因为指定了 -fdata-section -ffunction-section -Wl,因此并非目标文件中的所有内容都会链接到最终输出
  • readelf -s output.elf 提供文件之间的信息,但它只是列出每个文件下的符号及其大小。可以写一个脚本来求和一个文件下的所有大小,但是总的值似乎不对,这里的一个明显错误是某些符号可能指向同一个内存位置,因此可能会多次计算同一个内存区域。

当 gcc 链接完成其工作时,它应该知道从目标文件中提取并放入输出部分的所有详细信息,但似乎它没有提供生成详细报告的开关(或者我错过了什么?)

有什么工具可以完成这项工作吗?

【问题讨论】:

    标签: gcc hyperlink statistics out-of-memory


    【解决方案1】:

    也许--gc-sections 连同--print-gc-sections 和/或--print-map-discarded

    如果所有内容都在单独的部分中,那么您将所有部分作为输入,并列出丢弃的部分。然后简单的脚本将生成使用的部分列表、它们的大小和文件映射。

    【讨论】:

    • Severin,感谢您的建议,我的工具链支持--print-gc-sections,我检查了输出,似乎可行。我会尽力让你知道。
    • Severin,完成了。我遍历构建目录中的所有目标文件,使用size -A 收集所有部分名称和大小,并使用从ld --print-gc-sections 输出构建的字典,减去未链接的部分。它成功地为最终二进制文件提供了几乎所有文件的贡献(“几乎”,因为有一些标准库不在本地构建库中并且没有被计算在内),结果足以让我做进一步的工作。感谢您的大力帮助!
    • @EricSun 你有机会和我们分享你的剧本吗?
    • @kreuzerkrieg,很高兴这样做。请看gist
    猜你喜欢
    • 1970-01-01
    • 2012-07-29
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-16
    • 1970-01-01
    相关资源
    最近更新 更多