g++使用无论是建DWARF2,sjlj或seh异常模型. MinGW-builds提供g++具有不同异常模型的各种构建.我希望能够从gcc工具链中确定正在使用的异常模型.是否有一个g++参数将转储编译器的默认异常模型?
Mat*_*son 14
编辑:最初,我正在测试中描述的配置标志g++ -v.正如Jonathon Wakely在评论中指出的那样,这不是一件好事.
执行此操作的检查方法是编译到程序集:
struct S { ~S(); };
void bar();
void foo() {
S s;
bar();
}
Run Code Online (Sandbox Code Playgroud)
结果中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
Run Code Online (Sandbox Code Playgroud)
MinGW-4.8.1-x86-posix-dwarf:
.def ___gxx_personality_v0; .scl 2; .type 32; .endef
.def __Unwind_Resume; .scl 2; .type 32; .endef
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
MinGW-4.8.1-x64-posix-seh:
.def __gxx_personality_seh0; .scl 2; .type 32; .endef
.def _Unwind_Resume; .scl 2; .type 32; .endef
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
FC17-g++-4.7.2-x64:
.cfi_personality 0x3,__gxx_personality_v0
.globl __gxx_personality_v0
call _Unwind_Resume
Run Code Online (Sandbox Code Playgroud)
看起来我们应该搜索__gxx_personality_([a-z])(0-9]+)然后比较第一个捕获组:
v = dwarfseh = sehsj = sjlj