2013-07-31 5 views
6

g++ wird errichtet unter Verwendung entweder das DWARF2, sjlj oder seh Ausnahmemodell. MinGW-builds bieten verschiedene Builds von g++, die verschiedene Ausnahmemodelle haben. Ich möchte in der Lage sein, aus der gcc Toolchain zu ermitteln, welches Exception-Modell verwendet wird. Gibt es ein g++ Argument, das das Standardausnahmemodell des Compilers ausgibt?Beziehen aktuelle Ausnahme GCC Modell

+2

Sie können feststellen, ob gcc 'sjlj' verwendet, indem Sie die Ausgabe der Assembly-Kompilierung nach' _Unwind_SjLj_Resume' oder '_Unwind_Resume' suchen, denn das ist das [Konfigurationsskript] (http://gcc.gnu.org /git/?p=gcc.git;a=blob_plain;f=libstdc%2B%2B-v3/configure;hb=HEAD) für 'libstdC++' tut –

+0

Sie können auch nach '--enable-sjlj-exceptions' suchen in der Ausgabe von 'gcc -v' –

Antwort

9

Edit: Ursprünglich habe ich für die Konfiguration Flags getestet, die in g++ -v beschrieben werden. Wie Jonathon Wakely in den Kommentaren darauf hinweist, ist dies keine gute Sache zu tun.

Eine Inspektion Weg, es zu tun ist, um Montage zu kompilieren:

struct S { ~S(); }; 
void bar(); 
void foo() { 
    S s; 
    bar(); 
} 

Das Ergebnis g++ -S <filename> -o output.s haben folgende Ausnahme Referenzen in ihnen:

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 

Sieht aus wie wir für __gxx_personality_([a-z])(0-9]+) und dann vergleichen Sie die erste Capture-Gruppe suchen sollte:

  • v = dwarf
  • seh = seh
  • sj = sjlj
+0

Das ist falsch, wie die [docs] (http://gcc.gnu.org/install/configure.html) sagen, der Standard (dh was verwendet wird, wenn Sie nicht verwenden Alle möglichen - oder "deaktivierbaren" Optionen hängen von der Plattform ab. –

+0

Danke, Jonathan. Immer noch das Ausnahmemodell durch Kompilieren von Code ausarbeiten. –

+1

@ JonathanWakely, habe ich die Antwort aktualisiert, indem ich die Konfigurationsflag-Überprüfung weggenommen habe, danke, dass ich dir dabei geholfen habe. Ich habe einige Beispiele für die Kompilierung des Ausnahmebehandlungs-Snippets hinzugefügt, die ich im 'stdlibC++' Konfigurationsskript gefunden habe, und dann die Assembly angesehen, um die korrekten Basispersönlichkeiten zu bestimmen. Ich habe das folgende als Referenz verwendet: http://www.hexblog.com/wp-content/uploads/2012/06/Reccon-2012-Skochinsky-Compiler-Internals.pdf –

0

Nur die Antworten oben zu ergänzen, hat GCC ein vordefiniertes Makro bei der Kompilierung erkennen, so dass, ob SJLJ Ausnahmemodell verwendet wird:

__USING_SJLJ_EXCEPTIONS__

Dieses Makro ist Definiert mit dem Wert 1, wenn der Compiler den alten auf setjmp und longjmp basierenden Mechanismus für die Ausnahmebehandlung verwendet.

Siehe https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html

Laut Dokumentation ist es seit mindestens Version 3.1.1 zur Verfügung; Ich habe es gerade auf GCC 7.1 (unter MinGW-w64) getestet.