2

有没有办法找到一个特定的 gcc 构建,它是用哪些开关构建的?
我听说在从其源代码构建 gcc 构建时,有几个开关决定了某些特定功能是否可用,例如有Thread_posix和/或Win32_thread用于构建MingW的开关Windows,第一个允许使用 std::线程和另一个不会,或者sjlj构建与dwarf处理异常的构建(我什至不知道它们的用途!我只知道sjlj构建在所有情况下都会慢 15%!)
所以有没有我可以要了解这些以及这方面的更多信息吗?

4

2 回答 2

6

是的。的输出gcc -v显示你想知道的一切。

例外情况如下:

  • 矮人:--enable-dw2-exceptions
  • sjlj:--enable-sjlj-exceptions对于 4.8 之前的 64 位 MinGW-w64 GCC,或者什么都没有。
  • seh:--enable-seh-exceptions对于 GCC 4.8+ 64 位 MinGW-w64 GCC,或者什么都没有。

这些可以从 libgcc DLL 名称中推断出来,该名称始终包含sjljdw2seh.

libgcc 中使用的线程实现:

  • win32:默认,可选--enable-threads=win32
  • 正则表达式:--enable-threads=posix

据我所知,这些不能从文件名中推断出来。

于 2013-04-19T11:24:23.323 回答
2

在 Windows 上,使用最新的 GCC 版本(4.8 后),情况如下:

  1. 对于异常处理模型dwarf/sjlj/seh

    • win32 目标构建
      1. 为了dwarf2
        • --with-dwarf2应指定
      2. 为了sjlj
        • --enable-sjlj-exceptions应指定
        • --disable-sjlj-execptions如果您想强制禁用sjlj异常处理,也可以使用
    • win64 目标构建
      1. 为了seh
        • 无需指定任何内容。sjlj如果不使用,这是默认设置。
      2. 为了sjlj
        • --enable-sjlj-exceptions应指定
        • --disable-sjlj-execptions如果您想强制禁用sjlj异常处理,也可以使用
      • 注意:win64如果没有将异常处理参数传递给配置脚本,则默认值为seh异常
  2. 对于线程模型win32/posix

    1. 为了win32
      • --enable-threads=win32应指定
      • 注意win32如果没有将线程相关的参数传递给配置脚本,则为默认线程模型
    2. 为了posix
      • --enable-threads=posix应指定

找出已经构建的 MinGW GCC 的异常处理模型:

  1. 如果正在查看的 MinGW GCC 是使用--enable-shared
    • bin文件夹将libgcc作为 DLL
    • libgccDLL 将有一个前缀指示正在使用的异常处理模型,该模型将是dw2/seh/sjlj
  2. 如果正在查看的 MinGW GCC 是使用 构建的--disable-shared,它会变得有点复杂,您可以使用以下方法之一:
    1. 手动使用stringsgrep命令的组合从静态中找出来,这时候它libgcc.a不会<GCC_buildroot>/lib/gcc/<target>/<version>/libgcc.a有异常处理模型前缀
      • strings <GCC_buildroot>/lib/gcc/<target>/<version>/libgcc.a | grep personality输出将包括以下内容之一:
        1. sjlj__gcc_personality_sj0
        2. dwarf2__gcc_personality_v0
        3. seh__gcc_personality_seh0
    2. 手动检查 GCC 定义的指示异常处理模型的宏(不喜欢)
      • g++ -dM -E -x c++ - < /dev/null应存在以下其中一项
        1. sjlj#define __USING_SJLJ_EXCEPTIONS__ 1
        2. seh#define __SEH__ 1
        3. dwarf2:(#define __GCC_HAVE_DWARF2_CFI_ASM 1 不太确定这个)
于 2020-08-12T12:53:37.043 回答