GCC 链接器:如何在输出部分生成每个文件贡献的报告
GCC Linker : how to generate a report of per file contribution on output sections
最近我在尝试 link 我的程序时遇到了一个问题。它报告 .text
无法放入指定的内存区域。显然,源代码变得太大,无法在有限的内存区域中 linked。
我现在要做的是分析哪个文件对“.text”部分的贡献最大,以便进行后续的代码优化。试了很多方法都没成功
nm -s output.elf
给出每个符号的大小,但不要将符号分组在每个源文件下。
nm -s file.obj
遍历每个目标文件都不起作用,因为指定了 -fdata-section
-ffunction-section
-Wl
,所以并非目标文件中的所有内容都会得到 link编辑到最终输出
readelf -s output.elf
提供文件之间的信息,但它只是列出每个文件下的符号及其大小。可以写一个脚本求出一个文件下的所有size,但是总的值好像不对,这里一个明显的错误就是有些符号可能指向同一个内存位置,所以同一个内存区域可能会计算多次。
当 gcc link 执行它的工作时,它应该知道从目标文件中提取并放入输出部分的内容的所有详细信息,但它似乎没有提供生成详细信息的开关报告(或者我遗漏了什么?)
有什么工具可以完成这项工作吗?
也许 --gc-sections
和 --print-gc-sections
and/or --print-map-discarded
?
如果所有内容都在单独的部分中,那么您将所有部分作为输入,并列出丢弃的部分。然后简单的脚本将生成使用的部分列表、它们的大小和文件映射。
最近我在尝试 link 我的程序时遇到了一个问题。它报告 .text
无法放入指定的内存区域。显然,源代码变得太大,无法在有限的内存区域中 linked。
我现在要做的是分析哪个文件对“.text”部分的贡献最大,以便进行后续的代码优化。试了很多方法都没成功
nm -s output.elf
给出每个符号的大小,但不要将符号分组在每个源文件下。nm -s file.obj
遍历每个目标文件都不起作用,因为指定了-fdata-section
-ffunction-section
-Wl
,所以并非目标文件中的所有内容都会得到 link编辑到最终输出readelf -s output.elf
提供文件之间的信息,但它只是列出每个文件下的符号及其大小。可以写一个脚本求出一个文件下的所有size,但是总的值好像不对,这里一个明显的错误就是有些符号可能指向同一个内存位置,所以同一个内存区域可能会计算多次。
当 gcc link 执行它的工作时,它应该知道从目标文件中提取并放入输出部分的内容的所有详细信息,但它似乎没有提供生成详细信息的开关报告(或者我遗漏了什么?)
有什么工具可以完成这项工作吗?
也许 --gc-sections
和 --print-gc-sections
and/or --print-map-discarded
?
如果所有内容都在单独的部分中,那么您将所有部分作为输入,并列出丢弃的部分。然后简单的脚本将生成使用的部分列表、它们的大小和文件映射。