3.7 コマンドラインオプションを使用した C++ 例外テーブルの生成の制御

コマンドラインオプションを使用して、C++ 例外テーブルの生成を制御できます。

デフォルト、つまり、オプション --exceptions が指定されている場合は、イメージに例外テーブルを含めることができます。コードで例外がスローされない場合、例外テーブルは自動的に破棄されます。ただし、オプション --no_exceptions を指定すると、未使用セクションの削除後に例外テーブルが存在する場合、リンカによってエラーが生成されます。
--no_exceptions オプションを使用すると、コードで例外が処理されないようにできます。リンカは、エラーメッセージを生成して例外が検出されたことを通知し、最終イメージを生成しません。
ただし、--no_exceptions オプションを --diag_warning オプションと組み合わせて使用すると、エラーメッセージを警告メッセージに降格できます。この場合、リンカは、最終イメージを生成しますが、例外が検出されたことを警告するメッセージも生成します。
リンカは、従来のオブジェクト用に、デバッグフレーム情報を含む例外テーブルを作成できます。この操作は、C 言語またはアセンブリ言語のオブジェクトについては支障なく行うことができます。デフォルトでは、リンカは例外テーブルを作成しません。これは、リンカオプション --exceptions_tables=nocreate を使用した場合と同じです。
リンカオプション --exceptions_tables=unwind を使用すると、リンカは、.debug_frame 情報を使用して、例外テーブルを含んでいないイメージのセクションごとに、レジスタが復元する unwind テーブルを作成できます。unwind テーブルを作成できない場合、リンカは代わりに nounwind テーブルを作成します。
リンカオプション --exceptions_tables=cantunwind を使用すると、例外テーブルを含んでいないイメージのセクションごとに nounwind テーブルを作成できます。

以下の点に注意して下さい。
  • デフォルト(つまり、--exceptions --exceptions_tables=nocreate)では、C コードがオプション --exceptions でコンパイルされる場合を除き、C コードまたはアセンブリコードで例外をスローすることは安全ではありません。
  • リンカは、 .debug_frame 情報を使用して、オブジェクトからフレーム展開命令を生成できます。フレーム展開は、C およびアセンブラコードには十分です。しかし、展開されるスタック上のオブジェクトのデスクトラクタを呼び出さないため、C++ コードには不十分です。
    C++ のクリーンアップコードは、--exceptions オプションを使用して、コンパイラによって生成される必要があります。
関連する参考文書
12.40 --diag_warning=tag[,tag,…]
12.52 --exceptions、--no_exceptions
12.53 --exceptions_tables=action
関連情報
--exceptions、--no_exceptions コンパイラオプション
非機密扱いPDF file icon PDF 版ARM DUI0474LJ
Copyright © 2010-2015 ARM.All rights reserved.