最近我在尝试链接我的程序时遇到了一个问题。它报告.text
无法放入指定的内存区域。显然,源代码变得太大而无法在有限的内存区域中链接。
我现在要做的是分析哪个文件对“.text”部分贡献最大,以便进行后续代码优化。我尝试了很多方法但没有成功。
-
nm -s output.elf
给出每个符号的大小,但不要将符号分组到每个源文件下。
-
nm -s file.obj
遍历每个目标文件是行不通的,因为-fdata-section
-ffunction-section
-Wl
已指定,因此并非目标文件中的所有内容都会链接到最终输出
-
readelf -s output.elf
提供文件之间的信息,但它只是列出每个文件下的符号及其大小。可以编写一个脚本来计算一个文件下所有大小的总和,但总的值似乎是错误的,这里一个明显的错误是某些符号可能指向相同的内存位置,因此相同的内存区域可能会被计算多次。
当 gcc 链接完成其工作时,它应该知道从目标文件中提取内容并放入输出部分的所有详细信息,但似乎它不提供生成详细报告的开关(或者我遗漏了什么?)
有什么工具可以完成这项工作吗?
Perhaps --gc-sections
和...一起--print-gc-sections
and/or --print-map-discarded
?
如果所有内容都位于单独的部分中,那么您将所有部分作为输入,并列出废弃的部分。然后简单的脚本将生成已使用部分的列表、它们的大小和文件映射。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)