g++
jest zbudowane przy użyciu modelu wyjątku DWARF2
, sjlj
lub seh
. MinGW-builds udostępnia różne kompilacje g++
, które mają różne modele wyjątków. Chciałbym być w stanie określić z modelu narzędziowego gcc
jaki model wyjątku jest używany. Czy istnieje argument g++
, który zrzuci domyślny model wyjątku kompilatora?Uzyskiwanie bieżącego modelu wyjątku GCC
Odpowiedz
Edytuj: Oryginalnie testowałem flagi konfiguracji opisane w g++ -v
. Jak zauważa Jonathon Wakely w komentarzach, jest to niezbyt dobra sprawa:.
sposób kontroli, aby to zrobić jest skompilować do montażu:
struct S { ~S(); };
void bar();
void foo() {
S s;
bar();
}
Wynik g++ -S <filename> -o output.s
mają następujące referencje wyjątków w nich
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
Wygląda na to powinniśmy szukać __gxx_personality_([a-z])(0-9]+)
a następnie porównać pierwszą grupę do przechwytywania:
v
=dwarf
seh
=seh
sj
=sjlj
To jest niepoprawne, jak mówi [docs] (http://gcc.gnu.org/install/configure.html), domyślne (tj. co jest używane, gdy nie używasz wszelkie opcje '--enable' lub' --disable') zależą od platformy. –
Dzięki, Jonathan. Nadal rozważa opracowanie modelu wyjątku przez skompilowanie kodu. –
@ JonathanWakely, zaktualizowałem odpowiedź, sprawdzając flagę konfiguracji, dzięki za pomoc w tym. Dodałem kilka przykładów kompilacji fragmentu obsługi wyjątku, który znalazłem w skrypcie konfiguracyjnym 'stdlibC++', a następnie przyjrzałem się zestawowi, aby ustalić prawidłowe osobowości podstawowe. Użyłem tego jako odniesienia: http://www.hexblog.com/wp-content/uploads/2012/06/Recon-2012-Skochinsky-Compiler-Internals.pdf –
Wystarczy uzupełnić powyższe odpowiedzi, GCC posiada predefiniowane makra pozwalające rozpoznać w czasie kompilacji czy modelu wyjątek SJLJ jest stosowany:
__USING_SJLJ_EXCEPTIONS__
To makro jest zdefiniowane, o wartości 1, jeśli kompilator używa starego mechanizmu opartego na setjmp i longjmp do obsługi wyjątków.
Zobacz https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html
Zgodnie z dokumentacją, jest dostępny od wersji co najmniej 3.1.1; Właśnie przetestowałem go na GCC 7.1 (pod MinGW-w64).
- 1. Uzyskiwanie bieżącego numeru wiersza?
- 2. Uzyskiwanie bieżącego kodu SQL bieżącego kodu CodeIgniter
- 3. cakephp użyj innego modelu wewnątrz bieżącego modelu
- 4. Uzyskiwanie aktualnej architektury GCC
- 5. Uzyskiwanie bieżącego użytkownika, gdy wcieliła
- 6. Dostęp do bieżącego modelu w spring-mvc
- 7. Uzyskiwanie identyfikatora wątku bieżącego wywołania metody
- 8. Uzyskiwanie NetworkCredential dla bieżącego użytkownika (C#)
- 9. Uzyskiwanie bieżącego katalogu w celu C
- 10. Uzyskiwanie bieżącego adresu URL w przeglądarce Androida
- 11. Python: Uzyskiwanie komunikatu o błędzie wyjątku
- 12. Uzyskiwanie kompilacji GCC bez wstawiania wywołania memcpy
- 13. uzyskiwanie danych modelu do widoku backbone.js
- 14. Uzyskiwanie następnego i poprzedniego modelu z kolekcji
- 15. Uzyskiwanie dostępu do modelu z szablonu
- 16. Ember Uzyskiwanie właściwości z kontrolera w Modelu
- 17. Uzyskiwanie określonych atrybutów z modelu ActiveRecord
- 18. Uzyskiwanie bieżącego obiektu skryptu DOM w żądaniu ajaxowym (jquery)
- 19. Uzyskiwanie ścieżka pulpitu dla bieżącego użytkownika w OS X
- 20. Uzyskiwanie bieżącego src elementu iframe za pomocą JQuery
- 21. Android Google Maps Api V2, uzyskiwanie współrzędnych bieżącego centrum map
- 22. Uzyskiwanie bieżącego katalogu w aplikacji sieci web .NET
- 23. Uzyskiwanie bieżącego obiektu referencji użytkownika w Powershell bez pytania
- 24. Uzyskiwanie wyjątku Nullpointer po aktualizacji do wsparcia projektowania Android 22.2.1
- 25. Uzyskiwanie wyjątku java.lang.NullPointerException podczas wywoływania metody aktywacji w TaskClient
- 26. Uzyskiwanie wyjątku java.net.SocketTimeoutException: upłynął limit czasu połączenia w Androidzie
- 27. Uzyskiwanie wyjątku ClassCastException podczas próby wstawiania RelativeLayout w sposób dyanmowy?
- 28. Uzyskiwanie dziwnego wyjątku Nie można odczytać daty: "6 sierpnia 2012"
- 29. Uzyskiwanie wyjątku android.view.InflateException podczas ładowania mapy w urządzeniach Marshmallow
- 30. Uzyskiwanie wyjątku podczas konfigurowania projektu maven w jenkins
Wygląda na to, że możesz sprawdzić, czy gcc używa 'sjlj', sprawdzając wynik kompilacji złożenia, szukając' _Unwind_SjLj_Resume' lub '_Unwind_Resume', ponieważ to właśnie [skrypt konfiguracyjny] (http://gcc.gnu.org) /git/?p=gcc.git;a=blob_plain;f=libstdc%2B%2B-v3/configure;hb=HEAD) dla 'libstdC++' robi –
Możesz również sprawdzić wyjątki '--enable-sjlj -' w wyjściu 'gcc -v' –