【问题标题】:Illegal instruction CMOVE - Compile for i586非法指令 CMOVE - 为 i586 编译
【发布时间】:2016-02-01 03:43:20
【问题描述】:

我有一台 x86_64 机器,想为一台具有 i586 架构的机器进行编译。

我安装了:libc6-dev-x32libc6-dev:i386

然后我尝试像这样编译一个简单的hello world:

gcc -m32 -march=i586 -mcpu=i586 test.c -o test -static

它在我的机器上工作,但在目标上,我在CMOVE 指令上收到非法指令错误。所以他不知道CMOVE

我该如何解决这个问题?

【问题讨论】:

  • 如果我没记错的话,cmov 是在 i686 中引入的。您需要跟踪代码的哪一部分是使用 i686 假设编译的。
  • 这只是一个你好世界。那么它可能在那里呢?我不能告诉 gcc 不要使用 cmove 吗?
  • 我的猜测是:libc 在某处使用了 cmove 指令,并且由于您静态链接构建系统的 libc,因此它也在目标系统中使用。省略-static 有帮助吗?
  • 另一件事:我的发行版(debian jessie)提供了一个包“libc6-dev-i386”,它应该有助于链接到那个版本的glibc。

标签: c compilation cross-compiling i386


【解决方案1】:

你静态链接到你的主机系统的 glibc,它使用CMOV*-instructions。所以编译器开关不会有帮助。

一种选择是链接到dietlibc

  • 安装包dietlibc-dev:i386

  • 链接:diet gcc -m32 -march=i586 -mcpu=i586 test.c -o test -static

现在您的二进制文件不应包含违规指令。

【讨论】:

  • 它工作得很好,但是在使用 fopen() 之后,我再次得到非法指令错误。我能做什么?
  • @Donovaaan 令我惊讶的是,dietlibc-binaries 使用了您的目标机器不支持的指令。你能认出是哪一个吗?
  • 我做了这个:objdump -D test | grep cmove,我得到了一条指令:8048ba9: 0f 44 c3 cmove %ebx,%eax。你是这个意思吗?代码是这样的:pastebin.com/Ar7dM3qe 非常感谢您的帮助!
  • @Donovaaan 你能把二进制文件上传到某个地方吗?
  • 这很有趣......确实,我的dietlibc-binaries 中不存在这个cmove,这正是在这里再次给你带来麻烦的原因。您使用哪个版本?我使用来自 debian jessie 的 0.33~cvs20120325-6
【解决方案2】:

快速检查 debian / jessie 和命令

objdump -D /lib32/libc-2.19.so | grep cmove

显示那里有 cmove 指令。 wikipedia 提到它们是为 pentium pro 添加的。

据此blog

九月2014 年更新:GCC 和其他开发工具现在是 官方 linux 镜像,您可以从 Intel Developer Zone 下载。

应该有IoT installers pageSoftware Downloads for Boards and Kits 可用的东西

构建交叉编译器工具集可能是另一种选择。

【讨论】:

    猜你喜欢
    • 2014-06-15
    • 2015-07-20
    • 2015-12-23
    • 2014-07-18
    • 1970-01-01
    • 2019-01-21
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多