在不使用递归的C程序中,理论上应该可以计算出调用给定函数及其所调用的任何函数所需的最大/最坏情况堆栈大小。是否有任何免费、开源的工具可以从源代码或编译后的ELF文件中实现这一点?
另外,是否有一种方法可以从ELF文件中提取函数的堆栈帧大小,以便我可以尝试手动计算?
我正在使用MSPGCC 3.2.3编译MSP430(我知道它是一个旧版本,但在这种情况下我必须使用它)。分配的堆栈空间在源代码中设置,并且应尽可能小,以便其余内存可以用于其他事情。我已经阅读到需要考虑中断使用的堆栈空间,但我使用的系统已经考虑了这一点 - 我试图计算需要额外添加多少空间。此外,我已经阅读到函数指针使这个问题变得困难。在这里仅有几个地方使用函数指针,我知道它们可以调用哪些函数,因此如果已知被调用函数和调用函数所需的堆栈空间,则可以手动考虑这些情况。
静态分析似乎比运行时堆栈绘制更加健壮,但如果没有好的静态方法,那么在运行时计算是一种选择。
编辑:
我发现GCC的
另外,是否有一种方法可以从ELF文件中提取函数的堆栈帧大小,以便我可以尝试手动计算?
我正在使用MSPGCC 3.2.3编译MSP430(我知道它是一个旧版本,但在这种情况下我必须使用它)。分配的堆栈空间在源代码中设置,并且应尽可能小,以便其余内存可以用于其他事情。我已经阅读到需要考虑中断使用的堆栈空间,但我使用的系统已经考虑了这一点 - 我试图计算需要额外添加多少空间。此外,我已经阅读到函数指针使这个问题变得困难。在这里仅有几个地方使用函数指针,我知道它们可以调用哪些函数,因此如果已知被调用函数和调用函数所需的堆栈空间,则可以手动考虑这些情况。
静态分析似乎比运行时堆栈绘制更加健壮,但如果没有好的静态方法,那么在运行时计算是一种选择。
编辑:
我发现GCC的
-fstack-usage
标志,它将编译每个函数的帧大小保存下来。不幸的是,MSPGCC不支持它。但对于任何试图在不同平台上进行类似操作的人来说,这可能会很有用。