9

再帰を使用しない C プログラムでは、理論的には、特定の関数を呼び出すために必要な最大/最悪の場合のスタック サイズと、それが呼び出すものすべてを計算できるはずです。ソース コードまたはコンパイル済みの ELF ファイルから、これを実行できる無料のオープン ソース ツールはありますか?

あるいは、ELF ファイルから関数のスタック フレーム サイズを抽出する方法はありますか?

MSPGCC 3.2.3 を使用して MSP430 用にコンパイルしています (古いバージョンであることはわかっていますが、この場合はそれを使用する必要があります)。割り当てるスタック領域はソース コードで設定され、残りのメモリを他のことに使用できるようにできるだけ小さくする必要があります。割り込みによって使用されるスタック領域を考慮する必要があることを読みましたが、私が使用しているシステムは既にこれを考慮しています - その上に追加する余分な領域を計算しようとしています. また、関数ポインタがこれを難しくしていると読んだことがあります。ここで関数ポインタが使用されているいくつかの場所では、関数ポインタが呼び出すことができる関数を知っているので、呼び出された関数と呼び出し関数に必要なスタック領域がわかっている場合は、これらのケースを手動で考慮することができます。

静的分析は、実行時のスタック ペインティングよりも堅牢なオプションのように思えますが、静的に行う良い方法がない場合は、実行時にそれを実行することも選択肢の 1 つです。

編集:

-fstack-usageコンパイル時に各関数のフレーム サイズを保存するGCC のフラグを見つけました。残念ながら、MSPGCC はそれをサポートしていません。しかし、別のプラットフォームで似たようなことをしようとしている人にとっては役に立つかもしれません.

4

5 に答える 5

0

静的解析を行うしかないと思います。ほとんどがポインターになるすべての非静的ローカル変数のスペースを考慮する必要がありますが、とにかくスタックに格納されるポインターは、現在実行中のアドレス用にスペースを確保する必要がありますコンパイラによってスタックに格納されるため、関数が戻った後に制御を呼び出し元に戻すことができます。また、すべての関数パラメーター用のスペースが必要です。それに基づいて、すべてのパラメーター、自動変数をカウントし、それらのサイズを把握できるツールがあれば、必要なスタック フレームの最小サイズを計算できるはずです。コンパイラは、特定のアーキテクチャのスタックで値を調整することもできることに注意してください。

于 2013-04-01T13:46:38.587 に答える