illegal instruction问题窥探
最近调程序,出现illegal instruction问题,没有头绪。 索性把illegal instruction好好窥探一下。
Table of Contents
- 1 现象
- 2 关于“illegal instruction”
- 3 造成SIGILL的原因
- 3.1 将不正确的数据写入代码段
- 3.2 指令集的演进
- 3.3 工具链bug
- 4 错误排查指南
- 5 参考
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 $ ./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的标准也可能会有影响。
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
转载于:https://my.oschina.net/alphajay/blog/68629
illegal instruction问题窥探相关推荐
- 关于qte illegal instruction的一些心得
最近半个月在按照天嵌的TQ2440做qte方面的移植工作,去年刚拿到板子的时候用的是qt4.5的源码,那时还能顺利的移植到arm板上,可是最近也是按照天嵌手册来移植,当我编译一个qt测试程序,在arm ...
- illegal instruction错误
原文地址:http://www.kuche361.com/ht/view/id-39165 这是个臭名昭著的问题,试了很多方法,也没有解决. 7月15日~16日加起来搞了一天,把4.6.3重新编译了两 ...
- [ARM]【编译】【实践】 - 浮点编译选项NEON引发的Skia的库Illegal instruction运行错误和解决办法
前言,ARM编译器选项除了优化系统代码性能外,往往还具备其他一些设定,例如警告级别,和指令集的扩展 本文论述工作中遇到的一个编译开源浏览器chromine遇到的问题,由编译选项引发的可执行文件的Ill ...
- linux运行非法指令,illegal instruction非法指令的解决思路
我移植x264到开发板上,arm linux系统.移植好后将库都拷贝到nfs文件系统上,可是执行后出现illegal instruction的错误. 可能是x264配置问题,我的x264开始的编译配置 ...
- jetson nano 报错Illegal instruction(core dumped)
jetson nano 报错Illegal instruction(core dumped) 问题描述:好不容易对jetson nano开发板更换好镜像源.配置好远程xrdp桌面(可以参考我往期博文) ...
- Ubuntu/Jetson Nano问题解决“Illegal instruction(core dumped)”
困扰我好多天的问题终于解决了!!!!! 之前还好好运行的程序不知道为什么忽然几乎所有运行程序开始报错 "Illegal instruction(core dumped)" 也就是非 ...
- 程序报错误Illegal instruction的解决办法
问题: 目标板是rt5350,使用mipsel-linux-gcc 3.4.2编译器,源程序由C++转换到C语言. 程序中有3个线程:主线程.接受消息队列的线程和上传采集数据的线程: 当把上传采集数据 ...
- 解决MacBook Pro M2关于inport tensorflow 出现的Illegal instruction: 4
关于MacBook Pro M2关于inport tensorflow 出现的Illegal instruction: 4 1. 问题描述:新版的MacBook pro在完整移植老版python环境后 ...
- python import illegal instruction
jetson xavier 平台更新protobuf后报错illegal instruction Python 3.6.9 (default, Oct 8 2020, 12:12:24) [GCC 8 ...
- go开发中遇到的问题:the ntvdm cpu has encountered an illegal instruction
刚学习go开发遇到" the ntvdm cpu has encountered an illegal instruction",如图: 系统是windows 32,开发工具jet ...
最新文章
- 每30秒学会一个Python小技巧,GitHub星数4600+
- bootcss echarts_数据可视化插件使用(Echarts)
- @Transactional注解事务不回滚不起作用无效
- pycharm acejumpchar插件
- dotnet core 应用是如何跑起来的 通过自己写一个 dotnet host 理解运行过程
- 如何通过7个Logback调整立即改善Java日志记录
- 用c语言编写最大最小值_C语言学习教程,用C语言编写扫雷游戏
- Bailian2980 大整数乘法【大数】
- 洛谷 P3807 【模板】卢卡斯定理
- 第七章读书笔记《深入理解计算机系统》
- python只想调用函数不想执行.py
- PN结是什么?PN结有什么特征?PN结的应用
- win10计算机管理被阻止,Win10家庭版安装程序提示系统管理员已阻止你运行此应用的解决办法...
- 如何将其他注册商处的域名申请转出并转入阿里云(图文教程)
- QQ游戏自动登录器V4.0
- 世界银行贷款可持续发展农业项目商业计划书
- 键盘 部分 按键 ~ 需要长按才能打出来
- 如何做好网站优化推广
- 全网最全JavaScript正则表达式( 校验数字和字母)
- LeetCode第 310 场周赛
热门文章
- Oracle数据库之SQL单行函数---字符函数之TRIM
- flutter的路由工具类
- java版本对应jdk版本_jdk版本对应数字
- PHP 数字缩短(最多1倍)与还原
- Echarts多条折线可拖拽
- OpenJDK8 JAVA应用窗口在不同缩放比例下的表现(Windows10)
- JAVA CLASS混淆工具:JShrink简单试用
- Permission denied:通过共享复制,与打包后解压,目录权限不一样
- relocation R_X86_64_PC32 against symbol can not be used when making a shared object recompile with
- BAT中如何使用for循环