【问题标题】:Assembler Messages: no such instruction when Compiling C++汇编程序消息:编译 C++ 时没有这样的指令
【发布时间】:2018-07-25 04:01:34
【问题描述】:

我正在尝试在 Scientific Linux 6.7 版上使用 gcc/5.3 编译 C++ 代码。每当我运行我的 Makefile 时,我都会收到以下错误:

/tmp/ccjZqIED.s: Assembler messages:
/tmp/ccjZqIED.s:768: Error: no such instruction: `shlx %rax,%rdx,%rdx'
/tmp/ccjZqIED.s:1067: Error: no such instruction: `shlx %rax,%rdx,%rdx'
/tmp/ccjZqIED.s: Assembler messages:
/tmp/ccjZqIED.s:6229: Error: no such instruction: `mulx %r10,%rcx,%rbx'
/tmp/ccjZqIED.s:6248: Error: no such instruction: `mulx %r13,%rcx,%rbx'
/tmp/ccjZqIED.s:7109: Error: no such instruction: `mulx %r10,%rcx,%rbx'
/tmp/ccjZqIED.s:7128: Error: no such instruction: `mulx %r13,%rcx,%rbx'

我已经尝试遵循这个问题的建议,但我的输出没有改变: Compile errors with Assembler messages

我的编译器选项目前是:

CXXFLAGS        = -g -Wall -O0 -pg -std=c++11

有人知道是什么原因造成的吗?

【问题讨论】:

  • 您是否尝试过按照其他答案中的建议使用-mno-avx
  • 您使用的是什么平台?不同的处理器有不同的汇编指令。

标签: c++ c++11 gcc


【解决方案1】:

这意味着 GCC 正在输出您的汇编程序不支持的指令。要么来自源代码中的内联asm,要么不应该发生,并建议您使用较新的汇编程序在另一台机器上编译 GCC,然后将其复制到另一台无法正常工作的机器上。

假设这些指令没有在 asm 语句中显式使用,您应该能够告诉 GCC 不要发出带有合适标志的指令,例如 -mno-avx(或任何适合禁用这些特定标志的标志)说明)。

【讨论】:

    【解决方案2】:

    @jonathan-wakely 的回答是正确的,因为您的编译器调用的汇编器不理解您的编译器生成的汇编代码。

    至于为什么会发生这种情况,有多种可能性:

    1. 您手动安装了较新的编译器,而没有更新您的汇编器
    2. 您的编译器生成 64 位指令,但由于某种原因,汇编器仅限于 32 位指令

    禁用 AVX (-mno-avx) 不太可能有帮助,因为它也没有明确要求——引用的 CXXFLAGS 中没有 -march。如果它确实有帮助,那么你就没有向我们展示所有的编译器标志——如果你简单地包含整个编译器命令行,那将是最好的。

    如果我对上述 1. 的怀疑是正确的,那么您应该构建和/或安装最新的 binutils 包,该包将提供as 了解 AVX 指令等。然后,您需要使用传递给configure--with-as=/path/to/the/updated/as 标志来重建编译器。

    如果您的 Linux 安装仅为 32 位(怀疑 2),那么您根本不应该生成 64 位二进制文​​件。这是可能的,但不是微不足道的......

    发布uname -a 的输出以及导致上述错误消息的整个编译器命令行。

    【讨论】:

    • 我已经手动将gcc-10.0.0 安装到我的 Mac OS X 10.7.5 上,即从源代码,它工作正常。现在,当我尝试编译一个包时,它给出了错误 x86-64-arch.c no such instruction: xgetbv 这可能与未更新的 as 有关因为/usr/bin/as 符号链接到/Applications/Xcode-4.6.2.app/Contents/Developer/usr/bin/as,这是较旧和/或未更新的版本。所以看起来我需要更新 as 但是如何在 Mac OS X 上更新呢?在过去,我记得尝试更新它无济于事。那么该走哪条路呢?
    • 我认为,您需要先从源代码构建/安装binutils,然后使用我两年前写的--with-as 标志重建gcc。
    • 感谢您的快速回复。我刚刚构建并安装了一些较新版本的binutils 版本2.34 但即使所有配置和编译都顺利进行,as 不知何故只是没有构建,当我尝试时就是这种情况在一两年前更新它。我还记得在 Mac OS X 上,只有 Apple 在 XCode 套件上提供的 as 可以可靠地使用,即 binutils 提供的那些没有用(我需要重新确认这个细节)所以我认为我需要做更多关于在 Mac OS X 上更新 as 的研究。
    • 实际上,您可能会遇到另一个问题——您现有的编译器套件是 Xcode,它是 Apple 品牌的 clang。您正在尝试添加 GNU C。如果您只是想要更新的编译器,请尝试构建更新的 clang(版本 10.x 或 11.x)。如果您必须拥有 GNU C/C++,请弄清楚为什么它不使用您较新的 as
    猜你喜欢
    • 1970-01-01
    • 2021-05-10
    • 1970-01-01
    • 2021-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多