g++
は、DWARF2
,sjlj
またはseh
例外モデルのいずれかを使用して構築されます。 MinGW-buildsは、さまざまな例外モデルを持つg++
のさまざまなビルドを提供します。どのような例外モデルが使用されているのかをgcc
ツールチェーンから判断できるようにしたいと考えています。コンパイラのデフォルト例外モデルをダンプする引数はg++
ですか?現在のGCC例外モデルの取得
答えて
編集:元々、私はg++ -v
で説明されている構成フラグをテストしていました。コメントでJonathon Wakelyが指摘しているように、これはであり、良いことではないです。
それを行うための検査方法は、アセンブリにコンパイルすることです:
struct S { ~S(); };
void bar();
void foo() {
S s;
bar();
}
g++ -S <filename> -o output.s
の結果は、それらの中に次の例外への参照を持っている:
MinGW-4.8.1-x86-posix-sjlj
:
.def ___gxx_personality_sj0; .scl 2; .type 32; .endef
.def __Unwind_SjLj_Register; .scl 2; .type 32; .endef
.def __Unwind_SjLj_Unregister; .scl 2; .type 32; .endef
.def __Unwind_SjLj_Resume; .scl 2; .type 32; .endef
MinGW-4.8.1-x86-posix-dwarf
:
.def ___gxx_personality_v0; .scl 2; .type 32; .endef
.def __Unwind_Resume; .scl 2; .type 32; .endef
MinGW-4.8.1-x64-win32-sjlj
:
.def __gxx_personality_sj0; .scl 2; .type 32; .endef
.def _Unwind_SjLj_Register; .scl 2; .type 32; .endef
.def _Unwind_SjLj_Unregister; .scl 2; .type 32; .endef
.def _Unwind_SjLj_Resume; .scl 2; .type 32; .endef
MinGW-4.8.1-x64-posix-seh
:
.def __gxx_personality_seh0; .scl 2; .type 32; .endef
.def _Unwind_Resume; .scl 2; .type 32; .endef
MinGW-4.8.1-x64-posix-sjlj
:
.def __gxx_personality_sj0; .scl 2; .type 32; .endef
.def _Unwind_SjLj_Register; .scl 2; .type 32; .endef
.def _Unwind_SjLj_Unregister; .scl 2; .type 32; .endef
.def _Unwind_SjLj_Resume; .scl 2; .type 32; .endef
FC17-g++-4.7.2-x64
:
.cfi_personality 0x3,__gxx_personality_v0
.globl __gxx_personality_v0
call _Unwind_Resume
我々は__gxx_personality_([a-z])(0-9]+)
を検索し、その後に最初のキャプチャグループを比較すべきであるように見える:
v
=dwarf
seh
=seh
sj
=sjlj
[docs](http://gcc.gnu.org/install/configure.html)のように、これは間違っています。デフォルト(つまり、あなたが使用していないもの任意の '--enable'や' --disable'オプション)は、プラットフォームによって異なります。 –
ありがとう、ジョナサン。まだコードをコンパイルすることで例外モデルを試してみてください。 –
@JonathanWakely、私は、構成フラグのチェックを取って答えを更新しました。私は、 'stdlibC++'設定スクリプトで見つけた例外処理スニペットのコンパイルのいくつかの例を追加してから、アセンブリを見て正しい基本パーソナリティを決定しました。私は参考として以下を使用した:http://www.hexblog.com/wp-content/uploads/2012/06/Recon-2012-Skochinsky-Compiler-Internals.pdf –
ちょうど上記の回答を補完するために、GCCはSJLJ例外モデルが使用されているかどうかをコンパイル時に認識することを可能にする事前定義されたマクロがあります
__USING_SJLJ_EXCEPTIONS__
このマクロはコンパイラが例外処理のためにsetjmpおよびlongjmpに基づく古いメカニズムを使用する場合、値1で定義されます。
は、ドキュメントによればhttps://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html
を見る、少なくともバージョン3.1.1以降で使用可能です。私はGCC 7.1(MinGW-w64の下)でそれをテストしました。
- 1. グラフ外の現在のキャッシュを取得
- 2. Rubyで例外を発生させずに現在のスタックトレースを取得
- 3. Laravelは現在のバージョンのモデルのみを取得します
- 4. CakePHP:モデルの現在のコントローラ名を取得
- 5. Yii2のモデルから現在のモジュールオブジェクトを取得する方法
- 6. アクションフィルタで現在のモデルを取得する方法
- 7. cakephp 3.xモデルで現在のコントローラーアクションを取得する方法
- 8. odooで現在のモデルIDを取得する8
- 9. 現在のトピックを取得
- 10. 現在のバッチファイルディレクトリを取得
- 11. 現在のビューを取得
- 12. 現在のブラウザウィンドウセンターを取得
- 13. 現在のスレッドハンドルを取得
- 14. 現在のホームスクリーンイメージを取得
- 15. Spring、例外から複数のモデル違反を取得する
- 16. WebApplicationContextを現在のサーブレットコンテキストの外部に取得する方法
- 17. ルータ出口の外に現在のURLを取得する
- 18. ビューとコントローラの外部から現在のコントローラ名を取得
- 19. PHP:現在のファイル以外のURLを取得する
- 20. ジャスパー例外の取得
- 21. 例外の取得 'NSRangeException'
- 22. 例外の取得 - CordaM13に
- 23. RequestEntityTooLarge例外の取得
- 24. パーズ例外の取得
- 25. 例外ブロックの取得ScheduledExecutorService
- 26. 取得例外:org.hibernate.exception.sqlgrammarexception
- 27. 取得例外が
- 28. 現在の投稿idをループ外に取得します。ワードプレス
- 29. リアルータがコンポーネント外に現在のルートを取得する
- 30. Laravel現在のモデルのユーザー
gccが '_Unwind_SjLj_Resume'または' _Unwind_Resume'を探しているアセンブリコンパイルの出力をチェックすることによってgccが 'sjlj'を使用しているかどうかを調べることができるように見えますが、これは[configuration script](http://gcc.gnu.org /git/?p=gcc.git;a=blob_plain;f=libstdc%2B%2B-v3/configure;hb=HEAD) 'libstdC++'の場合 –
'--enable-sjlj-exceptions'をチェックすることもできます'gcc -v'の出力にあります。 –