有没有办法找到一个特定的 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 libgccDLL 将有一个前缀指示正在使用的异常处理模型,该模型将是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_sj0dwarf2:__gcc_personality_v0seh:__gcc_personality_seh0
- 手动检查 GCC 定义的指示异常处理模型的宏(不喜欢)
g++ -dM -E -x c++ - < /dev/null应存在以下其中一项sjlj:#define __USING_SJLJ_EXCEPTIONS__ 1seh:#define __SEH__ 1dwarf2:(#define __GCC_HAVE_DWARF2_CFI_ASM 1不太确定这个)
- 手动使用
于 2020-08-12T12:53:37.043 回答