红联Linux门户
Linux帮助

Error: no such instruction问题处理(去掉march优化)

发布时间:2017-03-18 09:42:47来源:linux网站作者:晓_月残风
我的gcc从4.2升级到6.2之后编译程序就出现的如下错误:
/tmp/ccI5xBw4.s:422: Error: no such instruction: `sarx %eax,%edx,%eax'
/tmp/ccI5xBw4.s:448: Error: no such instruction: `shlx %eax,%ecx,%eax'
/tmp/ccI5xBw4.s:1043: Error: no such instruction: `shlx %eax,%ecx,%eax'
/tmp/ccI5xBw4.s:1086: Error: no such instruction: `shlx %eax,%ecx,%eax'
/tmp/ccI5xBw4.s:1210: Error: no such instruction: `shlx %eax,%edx,%eax'
/tmp/ccI5xBw4.s:4030: Error: no such instruction: `shlx %eax,%ecx,%eax'
 
开始查到这是一类新的Intel指令。需要能够支持这类新指令的汇编器,即binutils。我的CentOS 6.7上已经用yum安装了binutils,版本为2.20.51.0.2,并没有解决。试着直接下载binutils最新版,编译安装。重新编译,不再报这个错误。
 
本以为一切已经OK,但下面的事情才是灾难开始。
 
装完最新的binutils后发现很多系统功能都失效了,首先是ssh不能用,之后gdb也出现了问题,一路查下去发现是/lib64目录下面的ld-2.12.so被替换为ld-2.17.so,但该目录下的原来指向ld-2.12.so的软连接ld-Linux-x86-64.so.2并没有指向ld-2.17.so。个人猜测重新启动可能能够恢复(并没有试过,如果导致机器起不来可要骂我)。
好吧我手贱并不知道ld-2.17.so这个文件有什么用,竟然用mv把它移到了/lib64外面,最崩溃的事情来了,包括ls,mv,cp等一系列的系统命令都不能用了,只能重装系统。
 
系统装好后又遇到了最开始的问题,这次我可不敢随便升级binutils的版本了。好吧既然是Intel的指令应该就是针对不同cpu来优化代码用的。那我不做这种优化总行了吧。
在Makefile文件中找到“-march=”这一条,我这里是“-march=native”,直接注释掉,再编译就通过了。
 
说明:“-march”选项是指定目标架构的名字,gcc就会生成针对目标架构优化的目标代码,如-march=prescott会生成针对i5或i7的目标码,从而充分发挥cpu的性能。自gcc4.2,引入了-march=native,从而允许编译器自动探测目标架构并生成针对目标架构优化的目标代码,这比手工设置要安全的多。
 
本文永久更新地址:http://www.linuxdiyf.com/linux/29265.html