有没有办法找到一个特定的 gcc 构建,它是用哪些开关构建的?
我听说在从其源代码构建 gcc 构建时,有几个开关决定了某些特定功能是否可用,例如有Thread_posix
和/或Win32_thread
用于构建MingW
的开关Windows
,第一个允许使用 std::线程和另一个不会,或者sjlj
构建与dwarf
处理异常的构建(我什至不知道它们的用途!我只知道sjlj
构建在所有情况下都会慢 15%!)
所以有没有我可以要了解这些以及这方面的更多信息吗?
问问题
1219 次
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 名称中推断出来,该名称始终包含sjlj
、dw2
或seh
.
libgcc 中使用的线程实现:
- win32:默认,可选
--enable-threads=win32
- 正则表达式:
--enable-threads=posix
据我所知,这些不能从文件名中推断出来。
于 2013-04-19T11:24:23.323 回答
2
在 Windows 上,使用最新的 GCC 版本(4.8 后),情况如下:
对于异常处理模型
dwarf/sjlj/seh
:- win32 目标构建
- 为了
dwarf2
--with-dwarf2
应指定
- 为了
sjlj
--enable-sjlj-exceptions
应指定--disable-sjlj-execptions
如果您想强制禁用sjlj
异常处理,也可以使用
- 为了
- win64 目标构建
- 为了
seh
- 无需指定任何内容。
sjlj
如果不使用,这是默认设置。
- 无需指定任何内容。
- 为了
sjlj
--enable-sjlj-exceptions
应指定--disable-sjlj-execptions
如果您想强制禁用sjlj
异常处理,也可以使用
- 注意:
win64
如果没有将异常处理参数传递给配置脚本,则默认值为seh
异常
- 为了
- win32 目标构建
对于线程模型
win32/posix
:- 为了
win32
--enable-threads=win32
应指定- 注意:
win32
如果没有将线程相关的参数传递给配置脚本,则为默认线程模型
- 为了
posix
--enable-threads=posix
应指定
- 为了
找出已经构建的 MinGW GCC 的异常处理模型:
- 如果正在查看的 MinGW GCC 是使用
--enable-shared
- 该
bin
文件夹将libgcc
作为 DLL libgcc
DLL 将有一个前缀指示正在使用的异常处理模型,该模型将是dw2/seh/sjlj
- 该
- 如果正在查看的 MinGW GCC 是使用 构建的
--disable-shared
,它会变得有点复杂,您可以使用以下方法之一:- 手动使用
strings
和grep
命令的组合从静态中找出来,这时候它libgcc.a
不会<GCC_buildroot>/lib/gcc/<target>/<version>/libgcc.a
有异常处理模型前缀strings <GCC_buildroot>/lib/gcc/<target>/<version>/libgcc.a | grep personality
输出将包括以下内容之一:sjlj
:__gcc_personality_sj0
dwarf2
:__gcc_personality_v0
seh
:__gcc_personality_seh0
- 手动检查 GCC 定义的指示异常处理模型的宏(不喜欢)
g++ -dM -E -x c++ - < /dev/null
应存在以下其中一项sjlj
:#define __USING_SJLJ_EXCEPTIONS__ 1
seh
:#define __SEH__ 1
dwarf2
:(#define __GCC_HAVE_DWARF2_CFI_ASM 1
不太确定这个)
- 手动使用
于 2020-08-12T12:53:37.043 回答