再帰を使用しない C プログラムでは、理論的には、特定の関数を呼び出すために必要な最大/最悪の場合のスタック サイズと、それが呼び出すものすべてを計算できるはずです。ソース コードまたはコンパイル済みの ELF ファイルから、これを実行できる無料のオープン ソース ツールはありますか?
あるいは、ELF ファイルから関数のスタック フレーム サイズを抽出する方法はありますか?
MSPGCC 3.2.3 を使用して MSP430 用にコンパイルしています (古いバージョンであることはわかっていますが、この場合はそれを使用する必要があります)。割り当てるスタック領域はソース コードで設定され、残りのメモリを他のことに使用できるようにできるだけ小さくする必要があります。割り込みによって使用されるスタック領域を考慮する必要があることを読みましたが、私が使用しているシステムは既にこれを考慮しています - その上に追加する余分な領域を計算しようとしています. また、関数ポインタがこれを難しくしていると読んだことがあります。ここで関数ポインタが使用されているいくつかの場所では、関数ポインタが呼び出すことができる関数を知っているので、呼び出された関数と呼び出し関数に必要なスタック領域がわかっている場合は、これらのケースを手動で考慮することができます。
静的分析は、実行時のスタック ペインティングよりも堅牢なオプションのように思えますが、静的に行う良い方法がない場合は、実行時にそれを実行することも選択肢の 1 つです。
編集:
-fstack-usage
コンパイル時に各関数のフレーム サイズを保存するGCC のフラグを見つけました。残念ながら、MSPGCC はそれをサポートしていません。しかし、別のプラットフォームで似たようなことをしようとしている人にとっては役に立つかもしれません.