2012-04-26 13 views
20

GCC 4.7.0をインストールするためにhomebrewを使用しましたが、私のプロジェクトのmakeはアセンブリ時に失敗しています。私は正常に.c - > .sからコードを取ることができますが、.s - > .oは失敗します。Mac OS Xでプロジェクトをアセンブル中にエラーが発生しました

GCCのインストールに使用する抽出式を表示するには、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(cctoolsを使用)がインストールしたGCC-4.7を使用すると、どうなりますか?私はそれが同様に役立つかどうかを見るために最適化を変更しようとしました。

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' 
+0

'-force_cpusubtype_ALL'オプションが疑わしいと思われます。すべてのx86-64 CPUに共通の命令を指定します。これらは明確にAVX命令であり、Sandy Bridge CPUより前には利用できません。 –

+0

魅惑的です。問題のコンピュータはサンディブリッジを搭載した2011年のMacBook Proです。 http://en.wikipedia.org/wiki/Advanced_Vector_Extensionsによれば、GCC 4.6はAVXをサポートしています。私が手動で.s - > .o(asコマンドに余分なオプションはありません)を実行しても、私はまだエラーを受け取ります。 – xrl

+1

ネイティブアセンブラとGNUアセンブラの使用時に問題が発生する可能性があります。 [link](http://stackoverflow.com/questions/9840207/how-to-use-avx-pclmulqdq-on-mac-os-x-lion) –

答えて

13

短所は、 '-march = native'オプションを削除することです(少なくとも私にとってはうまくいきました)。

+3

デフォルトのSSE2に戻す代わりに、パフォーマンスを気にするならば、SSE4.2となるAVXに最も近い命令セットの最適化を有効にする方が良いでしょう。ですから、私は '-march = native'を' -msse4.2'に置き換える方がいいでしょう。 – pszilard

+4

さらに良い: '-march = native -mno-avx'。または@capisceの答えを見てください。 – Chris

+0

@khkarens大変ありがとうございました。あなたは最高の価値があります。あなたは私に多くの時間を救った。乾杯。 ab –

4

AVX拡張機能について知らないasのバージョンが動作しているようです。新しいgasを構築するか、clangを使用して組み立てる必要があります。

+0

これは機能しません。私はmacportからGCCをインストールし、手動で.c - > .sと.s - > .oを試してみました。私は結果に質問を更新しました。 – xrl

+0

おそらく私はコンパイラでAVX命令を抑制することができましたか? – xrl

23

-Wa,-qをコンパイラフラグに追加すると、この問題が解決されました。 manページから:

-q

     Use the clang(1) integrated assembler instead of the GNU based system assembler.

-Wa部分は-Wlがリンカに引数を渡すずっと同じように、アセンブラにコンパイラドライバからそれを渡します。

+0

「-I/opt/local/include /」などのインクルードがあると、コンパイル時にタイプ: "clang:warning:引数が使用されていないという警告が表示されます。誰もが同じ問題を経験していますか?私は_really_何も警告なしで構築することができるのが好きです。 –

+1

私はこれを試して、 "clang:error:サポートされていない引数 '-q'をオプション 'Wa'に設定しました" – Jeff

+1

おそらくこれは少し遅いですが、おそらくOS Xでgccのエイリアスになっているclang – MrCodeBlok

関連する問題