最近调程序,出现illegal instruction问题,没有头绪。 索性把illegal instruction好好窥探一下。php
当执行一段程序时,发生错误,并报”illegal instruction”错html
typedef void(*FUNC)(void); int main(void) { const static unsigned char insn[4] = { 0xff, 0xff, 0xff, 0xff }; FUNC function = (FUNC) insn; function(); }
编译执行之:linux
$ gcc -o sigill illegal_instruction.c $ ./sigill Illegal instruction
illegal instruction,即SIGILL, 是POSIX标准中提供的一类错误。从名字上看,SIGILL是启动的某个进程中的某一句不能被CPU识别成正确的指令。此类错误是由操做系统发送给进程的,在进程试图执行一些形式错误、未知或者特权指令时操做系统会使用SIGILL信号终止程序。 SIGILL对应的常数是4.安全
进程在代码段中的数据是要被做为一个指令执行的。 若不当心覆盖了已有的代码段,可能会获得错误格式的指令。这种错误尤为在Just-In-Time即时编译器中最可能出现。工具
一样,若是不当心覆盖了栈上活跃记录中的返回地址,程序就可能根据这个错误地址,执行没有意义的内存中的数据,进而操做。测试
进一步能够认为,任何致使数据错误的问题均可能带来illegal instruction问题。好比硬盘发生故障。this
好比SIMD指令,自从奔腾4开始有MMX,X86的芯片就开始不停的增长和拓宽SIMD支持,SSE、SSE二、SSE三、SSE4二、AVX、AVX2。默认状况下,不少编译器都在O2或者O3中开了自动向量化,这就致使不少在新体系结构中编译的可执行程序,在老机器上运行时会有illegal instruction问题。spa
对于普通C语言经过编译器生成的可执行程序。通常都已经经过严格的测试,不会随便发生这种问题。因此若是你遇到这种错,而且试过了静态链,并且程序中没有嵌入式汇编,基本能够判定是工具链出了问题。 编译器?汇编器或者连接器。操作系统
根据Heiher的经验,请注意出现错误的指令可能和访存地址指令有关。 另外,浮点数的格式是否符合IEEE的标准也可能会有影响。.net