ARM-gcc堆栈使用文件为空

4
我正在使用arm-gcc工具链分析嵌入式程序的堆栈使用情况。该程序是单线程的,因此我通常可以使用gcc的-fstack-usage参数来分析堆栈。
通常,此选项会生成与编译单元一起的.su文件。这些文件描述了每个函数的堆栈使用情况。但在我的情况下,这些文件为空。
以下是.su文件内容的示例(来自https://mcuoneclipse.com/2015/08/21/gnu-static-stack-usage-analysis/):
main.c:36:6:bar    48    static
main.c:41:5:foo    88    static
main.c:47:5:main    8    static

我正在使用 gcc-arm-none-eabi-5_4-2016q3,但问题也存在于 gcc-arm-none-eabi-5_3-2016q1 上。

您对此问题有什么想法吗?或者有其他方法来控制堆栈使用情况吗?


你在编译命令行(而不是链接命令行)中是否使用了“-fstack-usage”选项?我尝试过gcc-arm-none-eabi-4_9-2015q2,它可以正常工作。 - hesham_EE
我将参数传递给gcc(用于编译)和g ++(用于链接)。我将尝试切换到ld作为链接器。 - Gp2mv3
建议使用gcc进行链接,而不是ld。 - hesham_EE
使用gcc、g++或ld都会得到相同的结果。这是链接器命令(不包括完整的文件列表): arm-none-eabi-gcc -T gcc_arm.ld -mthumb -mcpu=cortex-m0 --specs=nano.specs -Wl,--gc-sections,--print-gc-sections -fstack-usage - Gp2mv3
我尝试了这个方法,它可以工作(虽然在链接方面失败了)。尝试编译单个文件,看看是否生成了*.su文件:arm-none-eabi-gcc -mthumb -mcpu=cortex-m0 -o main main.c -fstack-usage - hesham_EE
是的,编译一个简单的 main.c 就可以产生堆栈使用情况。我只需要添加 --specs=nosys.specs 参数进行编译。 - Gp2mv3
1个回答

5

经过大量测试,我发现一种解决方案:-fstack-usage 似乎与 -flto 不兼容。

禁用 -flto 可以生成 .su 文件。

我不太清楚原因,但通过逐个启用/禁用标志找到了解决方案。同时,通过移除 -flto,链接器会失败,但堆栈使用情况仍然被计算。


对这个问题的迟来回复,但是已经提交了一个gcc bug。该Bug的确切行为因gcc版本而异 - 没有人在gcc 9上测试过 - 但对于版本7和10,临时文件将驻留在$TMPDIR中,并具有像ccwn8X1t.ltrans0.ltrans.su这样的名称。至于v11,.su文件至少有更可预测的名称和合理的位置 - 更多信息请参见链接。 - AJM
对我之前的迟到跟进的迟到跟进 - 在11.2和-flto-fstack-usage一起进行测试后,FILENAME.out在所有三种情况下都伴随着同一目录中的FILENAME.out.ltrans0.ltrans.su(因此不在$TMPDIR中)。在这些情况中的两种情况(使用-O2-O3构建)还有一个FILENAME.out.ltrans1.ltrans.su文件。我的-Os构建没有这样的文件,我认为在此之前我做的-O2构建也没有这样的文件。 - AJM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接