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
Antwort
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
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. –
Danke, Jonathan. Immer noch das Ausnahmemodell durch Kompilieren von Code ausarbeiten. –
@ 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 –
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.
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 –
Sie können auch nach '--enable-sjlj-exceptions' suchen in der Ausgabe von 'gcc -v' –