在虚拟机里执行protoc报非法指令( Illegal instruction)

问题

在x86虚拟机里编译perfetto的时候遇到执行protoc报非法指令,但是在host上编译的时候并没有这样的问题

原因

虽然虚拟机和宿主机都是同一个指令集架构,但是CPU在一些特殊指令上的支持还是有区别的,如果Host可以,但是虚拟机上不行,可能就是虚拟机CPU不支持某些特性,导致当执行到这些指令时无法识别,所以报非法指令的错误。

  • 下面是Host的CPU支持的特性
    image

  • 下面是虚拟机的CPU特性,明显要比宿主机少很多
    image

解决

修改虚拟机的启动参数,将CPU支持的特性跟host保持一致,加入--cpu host即可。

再次启动后,编译就顺利完成了,可以看到此时虚拟机CPU的特性跟Host就差不多了:
image

更完整的分析参考关注微信公众号

posted @ 2024-12-21 10:44  dolinux  阅读(112)  评论(0)    收藏  举报