带有 -fpack-struct 段错误的 gcc std::regex
Posted
技术标签:
【中文标题】带有 -fpack-struct 段错误的 gcc std::regex【英文标题】:gcc std::regex with -fpack-struct seg faults 【发布时间】:2017-09-29 22:15:35 【问题描述】:考虑以下简单的 c++ 程序
#include <iostream>
#include <regex>
int main(int argc, char * argv[])
std::regex foobar( "[A]+");
return 0;
使用 -fpack-struct=1 编译时会出现段错误
g++-5 -std=gnu++14 ./fpack_regex.cpp -fpack-struct=1 -o a.out && a.out
Segmentation fault (core dumped)
虽然
g++-5 -std=gnu++14 ./fpack_regex.cpp -o a.out && a.out
工作得很好。
知道为什么 pack-struct=1 选项可能导致此失败吗?
【问题讨论】:
GCC 在历史上与<regex>
有很多问题。您的 GCC 的确切版本是什么?
鉴于g++-5
,这可能是 gcc 5.something。 gcc 7 也会崩溃。使用此选项更改所有类和结构的对齐方式,这并不奇怪,给定来自头文件中模板的一堆代码,它最终的编译方式与位于使用默认选项编译的库中的另一组代码不同。我们最终在这里遇到的是无法沟通......
<regex>
是仅标头库吗?还是它还涉及标准库中的一些目标文件?在后一种情况下,如果您更改此类选项时失败,那一点也不奇怪。
@neilbutterworth g++-5 (SUSE Linux) 5.3.1 20160301 [gcc-5-branch revision 233849] 尽管 Sam 指出它在其他版本中
也与 cygwin 崩溃:g++ (GCC) 5.4.0
【参考方案1】:
开关 -fpack-struct 可能非常危险,例如。请参阅有关它的 gcc 文档警告:
https://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html我看到的主要问题是您的代码与标准库的二进制不兼容(它通常不使用打包的结构进行编译),因此调用(传输结构)可能会失败(正如他们实际所做的那样)。
建议不要用这个开关打包所有的结构,但是如果你需要打包结构,只打包你需要的。我还读到重新编译使用相同 fpack-struct 的 libstd 和/或 lib 可能会有所帮助,但无论如何这是一个有风险的选择。
这里也有一些信息(关于 fpack-struct 的旧 gcc 错误),它已经过时,但可能有用:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=14173
【讨论】:
我认为你是对的,我在二进制文件和 libstdc++ 之间遇到了兼容性问题。以上是关于带有 -fpack-struct 段错误的 gcc std::regex的主要内容,如果未能解决你的问题,请参考以下文章
带有 MinGW GCC 的 Eclipse CDT 生成错误 127