GCC非法指令
Posted
技术标签:
【中文标题】GCC非法指令【英文标题】:GCC illegal instruction 【发布时间】:2017-06-23 19:47:49 【问题描述】:当我编译这段代码时:
#include <random>
#include <iostream>
int main(int argc, char** argv)
std::random_device dev;
std::mt19937 mt(dev());
std::cout << mt() << std::endl;
return 0;
然后尝试使用gdb
运行生成的可执行文件,我收到此错误:
程序收到信号
SIGILL
,非法指令。std::(anonymous namespace)::__x86_rdrand ()
在 /build/gcc/src/gcc/libstdc++-v3/src/c++11/random.cc:69 69 /build/gcc/src/gcc/libstdc++-v3/src/c++11/random.cc: 没有这样的文件或目录。
我将 arch linux 与 Intel Core 2 Duo CPU T8100 一起使用。 我该如何解决这个问题?
【问题讨论】:
您是否有可能为比您现有的更新的 CPU 编译代码,因此 GCC 使用了您的 CPU 没有的一些指令? 检查堆栈,获得此(非法指令)的最简单方法是通过运行数组或类似(任何UB)来践踏返回地址。然后返回到一个不包含有效指令的地址。 添加示例代码 @Zeldhoron that doesn't crash for me: wandbox.org/permlink/vXUD7pgnoAptd2Pt 运行该确切代码在您的计算机上崩溃? 请提供您使用的准确编译器命令行。 【参考方案1】:错误信息是“非法指令”,你得到的唯一提示是__x86_rdrand()
。谷歌搜索 rdrand 会导致 RDRAND instruction,它似乎是为 Ivy Bridge 处理器添加的,而您的 Core 2 Duo 肯定不是。 (这张图表上是 Penryn:https://en.wikipedia.org/wiki/Template:Intel_processor_roadmap)
好的,所以你的 CPU 没有 RDRAND。这意味着编译器必须有关于它的目标是什么的错误信息。使用 GCC,要调整的标志是 -march
。在您的情况下,-march=core2
应该这样做。也可以说-march=native
,它将完全针对您正在编译的内容。
【讨论】:
以上是关于GCC非法指令的主要内容,如果未能解决你的问题,请参考以下文章
由于用于构建 GCC 的 CPU 的体系结构,这是 g++ 的“非法指令错误”吗?