3

DWARF2 デバッグ形式では、.debug_frame セクションにある CFI (Call Frame Information) の助けを借りて、スタックの巻き戻しがサポートされます。これはまさに、すべてのレジスタが前のフレームで値を取得するためのルールを保持するテーブルです。ただし、これらのルールはすべて、レジスタがスタック上のある場所に保存されるという事実に依存しています。これは、フレーム ポインターがない場合に前のフレーム レジスターでスタック ポインターの値を取得する場合には当てはまりません。このような場合、スタック ポインタはスタックに保存されず、その値をインクリメントおよびデクリメントするだけで管理される場合があります。ただし、dwarf2 (または一般的には dwarf 形式) では、レジスタ値が現在の値を超える式であることを示す方法はありません。したがって、私の質問は、dwarf2 デバッグ形式でスタックの巻き戻し中にスタック ポインターの値を取得する方法です (フレーム ポインターがない場合)。

-BV

4

3 に答える 3

2

そんな時のためにdwarf3はDW_CFA_val_offsetをサポートしているようです。したがって、これを使用して、現在の値に対する算術式に基づいて、前のフレームの SP の値を記録できます。別の可能な解決策は、スタック自体にスタック ポインターを保存することです (dwarf2 で動作します)。これは、コード効率がそれほど重要ではない -O0 最適化レベルで実行できます。

于 2011-03-15T10:37:18.780 に答える
0

あなたの問題と思われるものについては、このディスカッションを参照してください。提案が現在の基準に組み込まれているかどうかについては確信が持てません。

于 2011-02-23T21:09:11.710 に答える
0

私はこの議論に行きました。しかし、誰かが他の方法でそれを解決しようとしたことがあるかどうか疑問に思っていました. 私が考えることができる 1 つの方法は、スタック自体にスタック ポインターを不要に保存することです。次に、この場所を使用して、前のフレームの sp の値を取得します。

于 2011-02-25T10:08:51.073 に答える