2012-04-26 9 views
20

Użyłem homebrew do zainstalowania GCC 4.7.0, a projekt mojego projektu kończy się niepowodzeniem w czasie montażu. Mogę z powodzeniem pobrać kod z .c -> .s, ale .s -> .o kończy się niepowodzeniem.Błąd "brak takiej instrukcji" podczas składania projektu w systemie Mac OS X

Aby wyświetlić formułę parzenia używaną do instalacji GCC, należy spojrzeć na: https://github.com/Homebrew/homebrew-dupes/blob/master/gcc.rb. Zainstalowałem także binutils z wcześniejszych wersji przy użyciu https://github.com/mxcl/homebrew/blob/master/Library/Formula/binutils.rb. Instalacja binutils nie wydaje się wprowadzać nowego "as" w katalogu/usr/local/lib lub podobnym.

Jak mogę znaleźć ten brakujący błąd instrukcji? Wygląda na to, że kompilator jest poprawny, ale linker po prostu nie obsługuje tych instrukcji. Instrukcje wydają się być instrukcjami wektorowymi.

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 

Oto co się dzieje, gdy używam gcc-4.7 zainstalowane przez MacPorts (używa cctools). Próbowałem zmienić optymalizacje, aby zobaczyć, czy to też pomoże.

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

Opcja '-force_cpusubtype_ALL' wydaje się podejrzana. Określa instrukcje, które są wspólne dla wszystkich procesorów x86-64. Są to wyraźnie instrukcje AVX, które nie są dostępne przed procesorami Sandy Bridge. –

+0

Fascynujące. Komputer, o którym mowa, to 2011 MacBook Pro z Sandy Bridge. http://en.wikipedia.org/wiki/Advanced_Vector_Extensions mówi, że GCC 4.6 obsługuje AVX. Nawet gdy ręcznie wykonuję .s -> .o (brak dodatkowych opcji w poleceniu as) nadal otrzymuję błąd. – xrl

+1

możesz mieć problemy z używaniem natywnego asemblera a asemblera GNU. [link] (http://stackoverflow.com/questions/9840207/how-to-use-avx-pclmulqdq-on-mac-os-x-lion) –

Odpowiedz

13

Krótkim rozwiązaniem byłoby usunięcie opcji "-march = native" (przynajmniej zadziałało to dla mnie).

+3

Zamiast przywracania domyślnego SSE2, jeśli zależy Ci na wydajności, lepiej jest włączyć optymalizację zestawu instrukcji najbliższego do AVX, który byłby SSE4.2. Więc wolałbym zastąpić '-march = native' z' -msse4.2'. – pszilard

+4

Jeszcze lepiej: '-march = native -mno-avx'. Lub zobacz odpowiedź @capisce. – Chris

+0

@khkarens Dziękuję bardzo za twoją potężną pomoc. Zasługujesz na wszystko, co najlepsze. Oszczędziłeś mi mnóstwo czasu na wyszukiwanie. Twoje zdrowie. ab –

4

Wydaje się, że używasz wersji as że nie wie o rozszerzeniach AVX. Musisz albo zbudować nowszą wersję: gas, albo użyć clang do złożenia.

+0

To nie działa. Zainstalowałem GCC z Macports i próbowałem ręcznie z plików .c -> .s i .s -> .o. Zaktualizowałem pytanie z wynikami. – xrl

+0

Być może mógłbym ukryć instrukcje AVX w kompilatorze? – xrl

23

Dodanie -Wa,-q do flag kompilatora rozwiązało ten problem dla mnie. Od strony podręcznika dla AS:

-q

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

-Wa część przekazuje go od kierowcy kompilator asemblera, podobnie jak -Wl przekazuje argumenty do łącznika.

+0

Po uwzględnieniu (np. "-I/opt/local/include /") otrzymuję ostrzeżenia o typie "clang: warning: argument nieużywany podczas kompilacji:" -I/opt/local/include/"". Ktoś jeszcze doświadcza tego samego problemu? Naprawdę lubię być w stanie budować bez żadnych ostrzeżeń. –

+1

Próbowałem tego i otrzymałem "clang: błąd: nieobsługiwany argument" -q "do opcji" Wa "," – Jeff

+1

Być może jest to nieco późno, ale to prawdopodobnie oznacza, że ​​używasz klangu, który jest aliowany do gcc na OS X – MrCodeBlok

Powiązane problemy