2013-07-31 14 views
6

g++は、DWARF2,sjljまたはseh例外モデルのいずれかを使用して構築されます。 MinGW-buildsは、さまざまな例外モデルを持つg++のさまざまなビルドを提供します。どのような例外モデルが使用されているのかをgccツールチェーンから判断できるようにしたいと考えています。コンパイラのデフォルト例外モデルをダンプする引数はg++ですか?現在のGCC例外モデルの取得

+2

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++'の場合 –

+0

'--enable-sjlj-exceptions'をチェックすることもできます'gcc -v'の出力にあります。 –

答えて

9

編集:元々、私は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
+0

[docs](http://gcc.gnu.org/install/configure.html)のように、これは間違っています。デフォルト(つまり、あなたが使用していないもの任意の '--enable'や' --disable'オプション)は、プラットフォームによって異なります。 –

+0

ありがとう、ジョナサン。まだコードをコンパイルすることで例外モデルを試してみてください。 –

+1

@JonathanWakely、私は、構成フラグのチェックを取って答えを更新しました。私は、 'stdlibC++'設定スクリプトで見つけた例外処理スニペットのコンパイルのいくつかの例を追加してから、アセンブリを見て正しい基本パーソナリティを決定しました。私は参考として以下を使用した:http://www.hexblog.com/wp-content/uploads/2012/06/Recon-2012-Skochinsky-Compiler-Internals.pdf –

0

ちょうど上記の回答を補完するために、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の下)でそれをテストしました。

関連する問題