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 linuxIntel 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++ 的“非法指令错误”吗?

使用 -mfma 编译时的非法指令

Vortex86DX C++ 代码/工具链构建的非法指令

使用带有自定义对齐分配器实现的最新 g++ 使用 SSE 和 -O3 选项编译时出现非法指令(核心转储)

运行基本 Avx512 代码时获得非法指令

MIPS交叉编译错误:非法指令