相关文章推荐
留胡子的电影票  ·  Use a web app ...·  7 月前    · 
另类的蚂蚁  ·  Python - request ...·  1 年前    · 
苦闷的墨镜  ·  从DateTime转换为INT·  1 年前    · 

http://www.lingcc.com/2011/11/28/11851/

最近调程序,出现illegal instruction问题,没有头绪。 索性把illegal instruction好好窥探一下。

Table of Contents

当执行一段程序时,发生错误,并报”illegal instruction”错

typedef void(*FUNC)(void);
int main(void)
    const static unsigned char insn[4] = { 0xff, 0xff, 0xff, 0xff };
    FUNC function = (FUNC) insn;
    function();
  

编译执行之:

$ gcc -o sigill illegal_instruction.c
$ ./sigill
Illegal instruction

2 关于“illegal instruction”

illegal instruction,即SIGILL, 是POSIX标准中提供的一类错误。 从名字上看,SIGILL是启动的某个进程中的某一句不能被CPU识别成正确的指令。 此类错误是由操作系统发送给进程的,在进程试图执行一些形式错误、未知或者特权指令时操作系统会使用SIGILL信号终止程序。 SIGILL对应的常数是4.

3 造成SIGILL的原因

3.1 将不正确的数据写入代码段

进程在代码段中的数据是要被作为一个指令执行的。 若不小心覆盖了已有的代码段,可能会得到错误格式的指令。 这种错误尤其在Just-In-Time即时编译器中最可能出现。

同样,如果不小心覆盖了栈上活跃记录中的返回地址,程序就可能根据这个错误地址,执行没有意义的内存中的数据,进而操作。

进一步可以认为,任何导致数据错误的问题都可能带来illegal instruction问题。比如硬盘发生故障。

3.2 指令集的演进

比如SIMD指令,自从奔腾4开始有MMX,X86的芯片就开始不停的增加和拓宽SIMD支持,SSE、SSE2、SSE3、SSE42、AVX、AVX2。 默认情况下,很多编译器都在O2或者O3中开了自动向量化,这就导致很多在新体系结构中编译的可执行程序,在老机器上运行时会有illegal instruction问题。

3.3 工具链bug

对于普通C语言通过编译器生成的可执行程序。一般都已经通过严格的测试,不会随便发生这种问题。 所以如果你遇到这种错,并且试过了静态链,而且程序中没有嵌入式汇编,基本可以断定是工具链出了问题。 编译器?汇编器或者链接器。

3.4访存对齐或浮点数格式问题

根据Heiher的经验,请注意出现错误的指令可能和访存地址指令有关。 另外,浮点数的格式是否符合IEEE的标准也可能会有影响。

  • 程序中有没有特权指令、或者访问特权寄存器
  • 有没有将在较新CPU上编译得到的可执行文件拿到老CPU上运行
  • 程序中有没有嵌入式汇编,先检查。
    • 一般编译器很少会生成有这种问题的代码
    • X86平台上要尤其注意64位汇编指令和32位汇编指令的混用问题
  • 程序有在进程代码段空间写数据的机会吗?
  • 栈操作够安全吗?
  • 注意程序的ABI是否正确
    • 尤其是动态链和静态链是否处理的正确,尽量避免动态链的可执行文件调用错误库的问题(ARM的EABI,MIPS的N32/O32/N64都很可能出这种问题)
  • 用的工具链靠谱吗?
http://www.lingcc.com/2011/11/28/11851/最近调程序,出现illegal instruction问题,没有头绪。 索性把illegal instruction好好窥探一下。Table of Contents1 现象 2 关于“illegal instruction”3 造成SIGILL的原因3.1 将不正确的数据写入代
最近写了一个程序, 运行的时候出现了Illegal instruction错误, 觉得非常纳闷, 而且该打印的log并没有打印出来。 当时并没有报core dump错误(因为我的机器的core开关没有打开), 经过一段时间排查, 发现是程序出了问题。 下面, 我们看看最简化的程序(简化后, 一眼就可以看出问题): #include using namespace std; int main(
在制作TQ2440的LCD背光驱动时,碰到了一个问题:驱动已经完成,在内核启动代码中出现过“backlight initialized”,但是运行编译好的背光控制程序“backlight”时,却提示 -/bin/sh: backlight: not found。 驱动EmbedSky_backlight.c的代码 /**********************************... GOMIPS=hardfloat: use floating point instructions (the default) GOMIPS=softfloat: use soft floating point 完整的编译命令: #!/bin/sh export PATH=$PATH:/usr/l... 1.https://blog.csdn.net/u011119817/article/details/99679350/ 参考该文章完成jetson nano系统激活、增加交换空间大小、切换高低功率、更新系统并移除无用软件、安装系统所需包、配置Python虚拟环境、jtop安装、sklearn相关包安装。 2.opencv-gpu安装(参考这两篇文章完成安装)
我移植x264到开发板上,arm linux系统。移植好后将库都拷贝到nfs文件系统上,可是执行后出现illegal instruction错误。 可能是x264配置问题,我的x264开始的编译配置是 ./configure  --host=arm-none-linux-gnueabi  --cross-prefix=arm-linux-  --prefix=/opt/x264-arm  -
语义分割学习笔记2——Jetson Xavier安装pytorch一、whl文件安装pytorch二、安装torchvision三、测试是否安装成功 运行语义分割的代码,需要先安装pytorch,下面是我在Xavier上安装语义分割的步骤。 我的环境说明:
<h3>回答1:</h3><br/>"illegal instruction (core dump)" 意思是程序在运行时遇到了非法指令,导致程序崩溃,并生成了一个 "core dump" 文件。这通常是由于程序代码中存在错误或者程序使用了不兼容的硬件或操作系统功能导致的。 <h3>回答2:</h3><br/>illegal instruction (core dump)是指某个程序在执行时出现了非法指令,并因此导致崩溃,并生成核心转储文件(core dump)。这个错误需要通过分析崩溃现象来确定原因。 首先,我们需要查阅相关的错误日志,以及检查程序运行的相关环境,包括操作系统版本、CPU架构、程序编译器版本等。这有助于我们快速锁定原因。 一般情况下,illegal instruction (core dump)是由于程序在执行时执行了不支持的指令,或是执行了内存损坏的代码造成的。这些情况通常是由程序员在编写代码时没有考虑到特定环境下的限制,或是代码中出现了缺陷导致的。 针对这个错误,我们可以通过以下几个方式进行修复: 1.升级程序编译器或运行环境,并重新编译程序。这能够保证在新的环境下程序能够正确执行。 2.检查代码,确认代码中没有出现不支持的指令或内存损坏等问题。 3.通过使用调试工具,如GDB等,来跟踪程序的执行过程,定位到具体的错误代码,并修改代码以避免出现这些问题。 总之,illegal instruction (core dump)是一个常见的程序错误,需要通过仔细的分析和调试才能够解决。在编写程序时,我们需要考虑到不同运行环境的限制,并尽可能避免出现缺陷,以提高程序的稳定性和可靠性。 <h3>回答3:</h3><br/>Illegal instruction (core dump)是一种计算机错误。简而言之,计算机执行了无法理解的指令,并且因为这个错误导致程序的终止。这种错误通常会生成一个core dump文件,这个文件包含了程序崩溃时的内存状态,可以用于调试程序。 Illegal instruction错误通常是由于以下几种原因引起的: 1.硬件损坏:如果CPU或者内存损坏或者出现故障,计算机就可能执行不正常的指令,导致Illegal instruction错误。 2.软件更新:如果操作系统或者应用程序发生更新,但是旧程序与新程序不兼容,就可能导致Illegal instruction错误。 计算机会尝试执行无法识别或无法理解的操作码。 3.编译错误:编译器将代码转换成机器指令,如果编译器生成了错误的指令,就可能导致Illegal instruction错误。 如何解决Illegal instruction错误?这需要根据具体情况来定。可能需要检查计算机硬件是否正常,重新安装相关软件,或者对程序进行调试。确保代码正确,任何未定义的行为都被考虑到。 同时保持软件和硬件更新到最新版本可以预防这种错误