Illegal Instruction 错误初窥
来源:互联网 发布:mac修改dock 图标 编辑:程序博客网 时间:2024/05/17 07:55
source :http://www.lingcc.com/2011/11/28/11851/
1 现象
当执行一段程序时,发生错误,并报”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$ ./sigillIllegal 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的标准也可能会有影响。
4 错误排查指南
- 程序中有没有特权指令、或者访问特权寄存器
- 有没有将在较新CPU上编译得到的可执行文件拿到老CPU上运行
- 程序中有没有嵌入式汇编,先检查。
- 一般编译器很少会生成有这种问题的代码
- X86平台上要尤其注意64位汇编指令和32位汇编指令的混用问题
- 程序有在进程代码段空间写数据的机会吗?
- 栈操作够安全吗?
- 注意程序的ABI是否正确
- 尤其是动态链和静态链是否处理的正确,尽量避免动态链的可执行文件调用错误库的问题(ARM的EABI,MIPS的N32/O32/N64都很可能出这种问题)
- 用的工具链靠谱吗?
5 参考
- http://en.wikipedia.org/wiki/SIGILL
- http://www.slac.stanford.edu/BFROOT/www/Computing/Environment/Tools/Batch/exitcode.html
- http://stackoverflow.com/questions/6934592/is-this-a-valid-x86-assembly-instruction
- http://blog.csdn.net/qiaoliang328/article/details/4866367
- http://www.justlinux.com/forum/archive/index.php/t-117434.html
- Illegal Instruction 错误初窥
- Illegal Instruction 错误初窥
- ARM Illegal Instruction错误初窥
- illegal instruction错误
- 错误Illegal instruction 的解决方法
- 错误Illegal instruction 的解决方法
- 错误Illegal instruction 的解决方法
- 错误Illegal instruction 的解决方法
- 错误Illegal instruction 的解决方法
- 错误Illegal instruction 的解决方法
- 程序报错误Illegal instruction的解决办法
- gbd调试 错误 illegal instruction 4
- GDB 引起Illegal instruction: 4 错误解决办法
- Illegal instruction
- illegal instruction
- openwrt 编译node.js功能(解决Illegal instruction错误)
- Illegal instruction 原因
- Illegal instruction 出现原因
- 计算机科学中最重要的32个算法
- IOS学习——获取ios的MAC地址
- 介绍“Razor”— ASP.NET的一个新视图引擎
- 设计模式6大原则(1):单一职责原则
- 内存池
- Illegal Instruction 错误初窥
- IOS学习——获取iPhone的IP地址
- 准妈妈需要注意事项,准妈妈应该注意什么?
- spring.net学习网站
- BFS小结(持续更新中)
- c语言实现字符串分割
- ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第一篇:准备工作
- 百度地图查询视野范围内的建筑物
- 数组al[0,mid-1]和al[mid,num-1]是各自有序的,对数组al[0,num-1]的两个子有序段进行merge,得到al[0,num-1]整体有序