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

我的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,从而允许编译器自动探测目标架构并生成针对目标架构优化的目标代码,这比手工设置要安全的多。

  • 1
    点赞
  • 1
    收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:技术工厂 设计师:CSDN官方博客 返回首页
评论 1

打赏作者

高晓伟_Steven

相逢即是有缘,动力源于金钱。

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值