2013-07-31 24 views
6

g++ được tạo bằng cách sử dụng mô hình ngoại lệ DWARF2, sjlj hoặc seh. MinGW-builds cung cấp các bản dựng khác nhau của g++ có các kiểu ngoại lệ khác nhau. Tôi muốn có thể xác định từ chuỗi công cụ gcc mô hình ngoại lệ nào đang được sử dụng. Có một đối số g++ sẽ đổ mô hình ngoại lệ mặc định của trình biên dịch không?Lấy mô hình ngoại lệ GCC hiện tại

+2

Có vẻ như bạn có thể xác định xem gcc có đang sử dụng 'sjlj' hay không bằng cách kiểm tra kết xuất của trình biên dịch tìm kiếm' _Unwind_SjLj_Resume' hoặc '_Unwind_Resume' vì đó là [script cấu hình] (http://gcc.gnu.org) /git/?p=gcc.git;a=blob_plain;f=libstdc%2B%2B-v3/configure;hb=HEAD) cho 'libstdC++ 'không –

+0

Bạn cũng có thể kiểm tra cho' enable-sjlj-exceptions' ở đầu ra của 'gcc -v' –

Trả lời

9

Chỉnh sửa: Ban đầu, tôi đã thử nghiệm cờ cấu hình được mô tả trong g++ -v. Như Jonathon Wakely chỉ ra trong các ý kiến, đây là không phải là một điều tốt để làm.

Một cách kiểm tra để làm điều đó là để biên dịch để lắp ráp:

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

Kết quả của g++ -S <filename> -o output.s có tài liệu tham khảo sau ngoại lệ trong đó:

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 

Hình như chúng ta nên tìm kiếm __gxx_personality_([a-z])(0-9]+) và sau đó so sánh nhóm chụp đầu tiên:

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

Điều này không đúng, vì [docs] (http://gcc.gnu.org/install/configure.html) nói, mặc định (tức là những gì được sử dụng khi bạn không sử dụng bất kỳ tùy chọn '--enable' hoặc' --disable' nào tùy thuộc vào nền tảng. –

+0

Cảm ơn, Jonathan. Vẫn đang xem xét làm việc với mô hình ngoại lệ thông qua việc biên dịch mã. –

+1

@JonathanWakely, tôi đã cập nhật câu trả lời, lấy cờ kiểm tra cấu hình, cảm ơn vì đã giúp đỡ điều đó. Tôi đã thêm một số ví dụ về việc biên dịch đoạn mã xử lý ngoại lệ mà tôi đã tìm thấy trong kịch bản cấu hình 'stdlibC++' và sau đó xem xét hội đồng để xác định các đặc tính cơ sở chính xác. Tôi đã sử dụng các thông tin sau làm tài liệu tham khảo: http://www.hexblog.com/wp-content/uploads/2012/06/Recon-2012-Skochinsky-Compiler-Internals.pdf –

0

Chỉ cần để bổ sung cho các câu trả lời ở trên, GCC có một vĩ mô được xác định trước cho phép nhận tại thời gian biên dịch cho dù mô hình SJLJ ngoại lệ được sử dụng:

__USING_SJLJ_EXCEPTIONS__

Macro này là được định nghĩa, với giá trị 1, nếu trình biên dịch sử dụng cơ chế cũ dựa trên setjmp và longjmp để xử lý ngoại lệ.

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

Theo tài liệu, nó có sẵn ít nhất là từ phiên bản 3.1.1; Tôi vừa thử nghiệm nó trên GCC 7.1 (theo MinGW-w64).

Các vấn đề liên quan