获取当前的GCC异常模型

Mat*_*son 10 gcc mingw-w64

g++使用无论是建DWARF2,sjljseh异常模型. 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 = dwarf
  • seh = seh
  • sj = sjlj

  • @JonathanWakely,我更新了答案,取出了配置标志检查,感谢您提供帮助.我添加了一些我在`stdlibc ++`配置脚本中找到的异常处理代码片段的编译示例,然后查看了程序集以确定正确的基本个性.我使用以下作为参考:http://www.hexblog.com/wp-content/uploads/2012/06/Recon-2012-Skochinsky-Compiler-Internals.pdf (2认同)