在 Mac OS X 上组装项目时出现“没有这样的指令”错误

Posted

技术标签:

【中文标题】在 Mac OS X 上组装项目时出现“没有这样的指令”错误【英文标题】:Error "no such instruction" while assembling project on Mac OS X 【发布时间】:2012-05-06 20:41:37 【问题描述】:

我使用自制软件安装 GCC 4.7.0,但我的项目的 make 在组装时失败。我可以成功地从 .c -> .s 获取代码,但是 .s -> .o 失败了。

要查看用于安装 GCC 的 brew 公式,请查看:https://github.com/Homebrew/homebrew-dupes/blob/master/gcc.rb。我还使用 https://github.com/mxcl/homebrew/blob/master/Library/Formula/binutils.rb 从上游安装了 binutils。安装 binutils 似乎不会在 /usr/local/lib 或类似文件中引入新的“as”。

我怎样才能找到这个丢失的指令错误?看来编译器是正确的,但链接器根本不支持这些指令。这些指令看起来确实是向量指令。

xavierlange $> make suricata.o
/usr/local/bin/gcc-4.7 -DHAVE_CONFIG_H -I. -I..  -I../libhtp  -I/opt/local/include  -v -Wextra -Wall -fno-strict-aliasing -fno-tree-pre -Wno-unused-parameter -std=gnu99 -DOS_DARWIN -march=native   -DLIBPCAP_VERSION_MAJOR=1 -DHAVE_PCAP_SET_BUFF -DUNITTESTS -DREVISION="61d5fe3" -MT suricata.o -MD -MP -MF .deps/suricata.Tpo -c -o suricata.o suricata.c
Using built-in specs.
COLLECT_GCC=/usr/local/bin/gcc-4.7
Target: x86_64-apple-darwin11.3.0
Configured with: ../configure --enable-languages=c,c++,fortran,java,objc,obj-c++ --prefix=/usr/local/Cellar/gcc/4.7.0/gcc --datarootdir=/usr/local/Cellar/gcc/4.7.0/share --bindir=/usr/local/Cellar/gcc/4.7.0/bin --program-suffix=-4.7 --with-gmp=/usr/local/Cellar/gmp/5.0.4 --with-mpfr=/usr/local/Cellar/mpfr/3.1.0 --with-mpc=/usr/local/Cellar/libmpc/0.9 --with-system-zlib --enable-stage1-checking --enable-plugin --enable-lto --disable-multilib --disable-nls
Thread model: posix
gcc version 4.7.0 (GCC) 
COLLECT_GCC_OPTIONS='-mmacosx-version-min=10.7.3' '-D' 'HAVE_CONFIG_H' '-I' '.' '-I' '..' '-I' '../libhtp' '-I' '/opt/local/include' '-v' '-Wextra' '-Wall' '-fno-strict-aliasing' '-fno-tree-pre' '-Wno-unused-parameter' '-std=gnu99' '-D' 'OS_DARWIN' '-march=native' '-D' 'LIBPCAP_VERSION_MAJOR=1' '-D' 'HAVE_PCAP_SET_BUFF' '-D' 'UNITTESTS' '-D' 'REVISION=61d5fe3' '-MT' 'suricata.o' '-MD' '-MP' '-MF' '.deps/suricata.Tpo' '-c' '-o' 'suricata.o'
 /usr/local/Cellar/gcc/4.7.0/gcc/libexec/gcc/x86_64-apple-darwin11.3.0/4.7.0/cc1 -quiet -v -I . -I .. -I ../libhtp -I /opt/local/include -MD suricata.d -MF .deps/suricata.Tpo -MP -MT suricata.o -D__DYNAMIC__ -D HAVE_CONFIG_H -D OS_DARWIN -D LIBPCAP_VERSION_MAJOR=1 -D HAVE_PCAP_SET_BUFF -D UNITTESTS -D REVISION=61d5fe3 suricata.c -march=corei7-avx -mcx16 -msahf -mno-movbe -maes -mpclmul -mpopcnt -mno-abm -mno-lwp -mno-fma -mno-fma4 -mno-xop -mno-bmi -mno-bmi2 -mno-tbm -mavx -mno-avx2 -msse4.2 -msse4.1 -mno-lzcnt --param l1-cache-size=32 --param l1-cache-line-size=64 --param l2-cache-size=6144 -mtune=corei7-avx -fPIC -quiet -dumpbase suricata.c -mmacosx-version-min=10.7.3 -auxbase-strip suricata.o -Wextra -Wall -Wno-unused-parameter -std=gnu99 -version -fno-strict-aliasing -fno-tree-pre -o /var/folders/58/wg28y0x17p5c3s6y_2t2rj2h0000gn/T//ccKRmuNX.s
GNU C (GCC) version 4.7.0 (x86_64-apple-darwin11.3.0)
    compiled by GNU C version 4.7.0, GMP version 5.0.4, MPFR version 3.1.0-p8, MPC version 0.9
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring nonexistent directory "/usr/local/Cellar/gcc/4.7.0/gcc/lib/gcc/x86_64-apple-darwin11.3.0/4.7.0/../../../../x86_64-apple-darwin11.3.0/include"
ignoring nonexistent directory "/opt/local/include"
#include "..." search starts here:
#include <...> search starts here:
 .
 ..
 ../libhtp
 /usr/local/Cellar/gcc/4.7.0/gcc/lib/gcc/x86_64-apple-darwin11.3.0/4.7.0/include
 /usr/local/include
 /usr/local/Cellar/gcc/4.7.0/gcc/include
 /usr/local/Cellar/gcc/4.7.0/gcc/lib/gcc/x86_64-apple-darwin11.3.0/4.7.0/include-fixed
 /usr/include
 /System/Library/Frameworks
 /Library/Frameworks
End of search list.
GNU C (GCC) version 4.7.0 (x86_64-apple-darwin11.3.0)
    compiled by GNU C version 4.7.0, GMP version 5.0.4, MPFR version 3.1.0-p8, MPC version 0.9
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 1dbaf0f0ba4d4d18b5d0d00c3c7d024d
COLLECT_GCC_OPTIONS='-mmacosx-version-min=10.7.3' '-D' 'HAVE_CONFIG_H' '-I' '.' '-I' '..' '-I' '../libhtp' '-I' '/opt/local/include' '-v' '-Wextra' '-Wall' '-fno-strict-aliasing' '-fno-tree-pre' '-Wno-unused-parameter' '-std=gnu99' '-D' 'OS_DARWIN' '-march=native' '-D' 'LIBPCAP_VERSION_MAJOR=1' '-D' 'HAVE_PCAP_SET_BUFF' '-D' 'UNITTESTS' '-D' 'REVISION=61d5fe3' '-MT' 'suricata.o' '-MD' '-MP' '-MF' '.deps/suricata.Tpo' '-c' '-o' 'suricata.o'
 as -arch x86_64 -force_cpusubtype_ALL -o suricata.o /var/folders/58/wg28y0x17p5c3s6y_2t2rj2h0000gn/T//ccKRmuNX.s
/var/folders/58/wg28y0x17p5c3s6y_2t2rj2h0000gn/T//ccKRmuNX.s:7791:no such instruction: `vcvtsi2ssq %rax, %xmm0,%xmm0'
/var/folders/58/wg28y0x17p5c3s6y_2t2rj2h0000gn/T//ccKRmuNX.s:7792:no such instruction: `vmovd %xmm0, %eax'
/var/folders/58/wg28y0x17p5c3s6y_2t2rj2h0000gn/T//ccKRmuNX.s:7799:no such instruction: `vcvtsi2ssq %rdx, %xmm0,%xmm0'
/var/folders/58/wg28y0x17p5c3s6y_2t2rj2h0000gn/T//ccKRmuNX.s:7800:no such instruction: `vaddss %xmm0, %xmm0,%xmm0'
/var/folders/58/wg28y0x17p5c3s6y_2t2rj2h0000gn/T//ccKRmuNX.s:7801:no such instruction: `vmovd %xmm0, %eax'
/var/folders/58/wg28y0x17p5c3s6y_2t2rj2h0000gn/T//ccKRmuNX.s:7804:no such instruction: `vmovd %eax, %xmm1'
/var/folders/58/wg28y0x17p5c3s6y_2t2rj2h0000gn/T//ccKRmuNX.s:7805:no such instruction: `vmovd %edx, %xmm2'
/var/folders/58/wg28y0x17p5c3s6y_2t2rj2h0000gn/T//ccKRmuNX.s:7806:no such instruction: `vdivss %xmm2, %xmm1,%xmm0'
/var/folders/58/wg28y0x17p5c3s6y_2t2rj2h0000gn/T//ccKRmuNX.s:7807:no such instruction: `vunpcklps %xmm0, %xmm0,%xmm0'
/var/folders/58/wg28y0x17p5c3s6y_2t2rj2h0000gn/T//ccKRmuNX.s:7808:no such instruction: `vcvtps2pd %xmm0, %xmm0'
/var/folders/58/wg28y0x17p5c3s6y_2t2rj2h0000gn/T//ccKRmuNX.s:7809:no such instruction: `vmovd %xmm0, %rax'
/var/folders/58/wg28y0x17p5c3s6y_2t2rj2h0000gn/T//ccKRmuNX.s:7819:no such instruction: `vmovd %rax, %xmm0'
make: *** [suricata.o] Error 1

当我使用 MacPorts 安装的 GCC-4.7(它使用 cctools)时会发生这种情况。我尝试更改优化,看看是否也有帮助。

xavierlange $> /opt/local/bin/gcc-mp-4.7 -DHAVE_CONFIG_H -I. -I..  -I../libhtp  -I/usr/local/include -I/opt/local/include  -g -O0 -Wextra -Wall -fno-strict-aliasing -fno-tree-pre -Wno-unused-parameter -std=gnu99 -DOS_DARWIN -march=native   -DLIBPCAP_VERSION_MAJOR=1 -DHAVE_PCAP_SET_BUFF -DUNITTESTS -DREVISION="61d5fe3" -MT suricata.o -MD -MP -MF .deps/suricata.Tpo -S suricata.c -o suricata.s
xavierlange $> /opt/local/bin/as suricata.s suricata.s:9811:no such instruction: `vcvtsi2ssq %rax, %xmm0,%xmm0'
suricata.s:9812:no such instruction: `vmovd %xmm0, %eax'
suricata.s:9819:no such instruction: `vcvtsi2ssq %rdx, %xmm0,%xmm0'
suricata.s:9820:no such instruction: `vaddss %xmm0, %xmm0,%xmm0'
suricata.s:9821:no such instruction: `vmovd %xmm0, %eax'
suricata.s:9824:no such instruction: `vmovd %eax, %xmm1'
suricata.s:9825:no such instruction: `vmovd %edx, %xmm2'
suricata.s:9826:no such instruction: `vdivss %xmm2, %xmm1,%xmm0'
suricata.s:9827:no such instruction: `vunpcklps %xmm0, %xmm0,%xmm0'
suricata.s:9828:no such instruction: `vcvtps2pd %xmm0, %xmm0'
suricata.s:9829:no such instruction: `vmovd %xmm0, %rax'
suricata.s:9839:no such instruction: `vmovd %rax, %xmm0'

【问题讨论】:

-force_cpusubtype_ALL 选项似乎很可疑。它指定了所有 x86-64 CPU 通用的指令。这些显然是 AVX 指令,在 Sandy Bridge CPU 之前不可用。 令人着迷。有问题的计算机是带有 Sandy Bridge 的 2011 MacBook Pro。 en.wikipedia.org/wiki/Advanced_Vector_Extensions 说 GCC 4.6 支持 AVX。即使我手动执行 .s -> .o (as 命令上没有额外的选项)我仍然得到错误。 在使用本机汇编程序与 GNU 汇编程序时,您可能会遇到问题。 link 是的,这就是我尝试自己安装 binutils 的原因。最大的问题是 binutils (2.22) 没有构建“as”或“gas”。关于手动构建“as”的任何提示? 叮叮叮,直接bug的逻辑结论是禁用avx。 CFLAGS="-mno-avx" 是我前进所需要的一切。但是,这并不能解决为什么我的编译器会发出我无法汇编的程序集的问题。 【参考方案1】:

-Wa,-q 添加到编译器标志为我解决了这个问题。来自 as 的手册页:

-q 使用 clang(1) 集成汇编器而不是基于 GNU 的系统汇编器。

-Wa 部分将其从编译器驱动程序传递给汇编程序,就像 -Wl 将参数传递给链接器一样。

【讨论】:

当包含(例如“-I/opt/local/include/”)时,我收到“clang:警告:编译期间未使用的参数:'-I /opt/local/include”类型的警告/'”。还有其他人遇到同样的问题吗?我真的喜欢能够在没有任何警告的情况下进行构建。 我试过这个并得到“clang: error: unsupported argument '-q' to option 'Wa,'” 也许这有点晚了,但这可能意味着你正在使用 clang,它在 OS X 上别名为 gcc【参考方案2】:

简短的解决方案是删除“-march=native”选项(至少它对我有用)。

【讨论】:

与其回退到默认的 SSE2,如果您关心性能,最好启用最接近 AVX 的指令集(即 SSE4.2)进行优化。所以我宁愿把-march=native换成-msse4.2 更好:-march=native -mno-avx。或者查看@capisce 的答案。 @khkarens 非常感谢您的大力帮助。你值得所有最好的。你为我节省了很多搜索时间。干杯。 ab 为什么要降级并失去处理器功能? 请注意,如果您确实想要/需要 AVX2 扩展(例如,在某些数据库系统或图形处理中),这不是一个选项。【参考方案3】:

您似乎正在运行不了解 AVX 扩展的 as 版本。你要么需要构建一个更新的gas,要么使用clang 来组装。

【讨论】:

这不起作用。我从 macports 安装了 GCC,并尝试从 .c -> .s 和 .s -> .o 手动进行。我已经用结果更新了问题。 也许我可以在编译器中抑制 AVX 指令?

以上是关于在 Mac OS X 上组装项目时出现“没有这样的指令”错误的主要内容,如果未能解决你的问题,请参考以下文章

在 Mac OS X 10.11.6 El Capitan 上安装 ffmpeg 时出现问题 [关闭]

使用 xampp 在 mac os x 上加载 css 和 jquery 文件时出现错误 403

在 VS Code 上模拟 Android 时出现“无效参数:找不到 null 的可执行文件” - Mac OS X

在 Mac OS X 中创建反应应用程序时出现 EACCESS 权限错误

使用 GCC 4 在 Mac OS X 中安装 gammu 时出现 LONG_BIT 错误

从 Mac OS X 10.6 64 位 macbook 运行时出现 CORBA 异常