例外テーブルと unwind テーブル

例外テーブルは、C++ などの高級言語の関数によってスローされた例外を処理するために必要です。unwind テーブルには、そうした例外の処理に必要なデバッグフレーム情報が格納されます。例外は、unwind テーブルを持つ関数内のみを伝播できます。

C++ で記述された関数には、デフォルトで unwind 情報が生成されます。ただし、C++ コードから呼び出されるアセンブリ言語の関数(PROC/ENDP または FUNC/ENDFUNC で囲まれたコード)の場合、例外が関数内を伝播できるようにするには、例外テーブルと unwind テーブルが存在していることを確認する必要があります。

例外は、nounwind テーブルを持つ関数内を伝播できません。例外処理時に nounwind テーブルに遭遇した場合、例外処理ラインタイム環境によってプログラムが終了します。

アセンブラでは、すべての関数および非関数に対して nounwind テーブルエントリを生成できます。関数内部でスタックの使用を記述する十分な FRAME ディレクティブが関数に含まれている場合にのみ、その関数の unwind テーブルをアセンブラで生成できます。関数の unwind テーブルを作成できるようにするには、各 POP 命令または PUSH 命令の後に、それぞれ FRAME POP ディレクティブまたは FRAME PUSH ディレクティブを記述する必要があります。関数は、『Exception Handling ABI for the ARM Architecture』(EHABI)、セクション 9.1「Constraints on Use」で規定されている条件に準拠する必要があります。アセンブラは unwind テーブルを生成できない場合、nounwind テーブルを生成します。

Show/hide関連項目

Copyright © 2010-2011 ARM. All rights reserved.ARM DUI 0473FJ
Non-ConfidentialID111311