注册

Linux报 “illegal instruction” 异常的原因以及解决办法

当 Linux 上的程序收到 "Illegal instruction" 错误时,它表示正在尝试执行一种不支持的 CPU 指令,通常是由于使用了错误的 CPU 架构导致的。以下是 "Illegal instruction" 错误的原因和解决办法。

原因:

  1. CPU 架构不匹配:程序被编译为针对一个不匹配的 CPU 架构而运行。

  2. 编译器问题:程序被使用了不兼容的编译器编译,或编译器安装有问题。

  3. 使用了不支持的指令:程序正在尝试执行一条不支持的 CPU 指令。

解决办法:

  1. 检查 CPU 架构:在运行程序之前,可以通过执行 uname -a 命令来查看 CPU 架构信息。如果程序是针对一个不兼容的 CPU 架构而编译的,应该使用与该架构兼容的目标平台重新编译程序。

例如,如果程序运行在 x86 架构的机器上,而编译时使用了 ARM 架构,那么就需要使用与 x86 兼容的编译选项重新编译源代码。

  1. 重新编译程序:如果程序在正确的 CPU 架构上运行而出现 "Illegal instruction" 错误,则需要重新编译程序。重新编译之前,可以尝试使用不同版本的编译器,并在编译过程中检查是否存在错误。

例如,对于使用 GCC 编译的程序,可以尝试使用较新版本的 GCC,并使用 -march=native 编译选项将程序优化为当前系统的 CPU 架构。

  1. 检查代码:如果上述方法都不能解决问题,需要检查程序代码是否存在与 CPU 不兼容的指令。可以使用调试器(例如 gdb)来分析程序崩溃的原因,并查找代码中是否存在错误。

例如,在使用 gdb 调试程序时,可以使用 disassemble 命令来查看程序崩溃时的代码,来寻找可能存在的错误。

以下是一个示例,在 Linux 上运行一个编译错误的程序,出现 "Illegal instruction" 错误,需要重新编译程序:

  1. 使用命令 uname -a 查看当前系统的 CPU 架构信息:

$ uname -a
Linux example.com 5.4.0-94-generic #105-Ubuntu SMP Wed Jun 30 16:46:52 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

从输出中可以看到,系统的 CPU 架构为 x86_64。

  1. 运行一个编译错误的程序,出现 "Illegal instruction" 错误:

$ ./a.out
Illegal instruction (core dumped)

  1. 重新编译程序并使用 -march=native 编译选项进行优化:

$ gcc -march=native -o a.out source.c

  1. 重新运行程序:

$ ./a.out
hello world!