2013-10-01 19 views
6

Tak oto sytuacja: muszę mieć możliwość kompilowania plików binarnych z komputera z systemem Linux (w systemie Ubuntu, ile to jest warte), które można uruchomić z serwera SPARC. Program Próbuję skompilować jest bardzo prosta:Nie można skompilować krzyżowo do SPARC za pomocą clang

#include <stdio.h> 
#include <stdlib.h> 

int main() { 
    printf("Testing the SPARC program..."); 
    return EXIT_SUCCESS; 
} 

Próbowałem wiele różnych linii kompilacji aby zmusić go do pracy, ale niestety nic nie wydaje się działać.

Próbowałem tradycyjna:

clang -target sparc blah.c -o blahsparc 

Ale to nie działa, z wieloma awariami asemblera:

/tmp/blah-519e77.s: Assembler messages: 
/tmp/blah-519e77.s:7: Error: unknown pseudo-op: '.register' 
/tmp/blah-519e77.s:8: Error: unknown pseudo-op: '.register' 
/tmp/blah-519e77.s:9: Error: unknown pseudo-op: '.register' 
/tmp/blah-519e77.s:10: Error: unknown pseudo-op: '.register' 
/tmp/blah-519e77.s:11: Error: no such instruction: 'save %sp,-240,%sp' 
/tmp/blah-519e77.s:12: Error: no such instruction: 'st %g0, [%fp+2043]' 
... 
clang: error: assembler (via gcc) command failed with exit code 1 (use -v to see invocation) 

próbowałem to również:

clang -cc1 -triple "sparc-unknown-Linux" blah.c -o blahsparc 

, który narzeka na brakujące nagłówki, więc zamiast używać -cc1, używam -Xclang:

clang -Xclang -triple -Xclang "sparc-unknown-Linux" blah.c -o blahsparc 

jednak to również nie działa z powodu "błędu: nieznanego docelowego procesora" x86-64 "". Nie jestem pewien, jak to zrobić. Próbowałem również używać crosstool-ng z bardzo małym sukcesem.

+0

Clang [dokumentacja] (http://clang.llvm.org/docs/UsersManual.html) sugeruje, że obsługa SPARC nie jest kompletna. – nneonneo

+0

Czy sprawdziłeś najnowszy kod i zbudowałeś go sam? Jestem pewien, że clang/llvm w ubuntu to dobra droga za svn trunk. Widzę sporadyczne zobowiązania do LLVM dla sparc, więc przynajmniej wsparcie dla llvm powinno się poprawić. – cb88

Odpowiedz

4

Od wydania 3.4.2 (czerwiec 2014), llvm brakuje kodu niezbędnego do wygenerowania plików obiektów dla celów sparc. Starsze wersje (1.x & 2.x) miały na to wsparcie, ale framework Llvm do emitowania plików obiektów był wtedy mniej dojrzały. Kiedy obecne środowisko zostało wdrożone, wygląda na to, że nie przeprowadziło migracji wszystkich platform.

Wydaje się sugerować, że kombinacja llvm/gcc działa, ale myślę, że tabela została zestawiona w tabele na podstawie znacznie wcześniejszej wersji llvm, gdy mieli mniej dojrzałe ramy do emitowania plików obiektów.

Wsparcie dla emitujących plików obiektowych dodano do ich rewizji w SVN bagażniku r198533 (this thread omawia commit), ale jak widać w 3.4.2 final release pliki & zmiany dodane w r198533 nie są obecne.


W dodatku spang clang obecnie nie działa w sparc solaris (nie jestem pewien ogólnie o sparc). Analizator składni ma problemy z analizowaniem szablonów; Dostaję coredumpy podobne. Przebiegłem ponad tydzień temu dyskutując o problemach z wyrównaniem w klanie sparc/solaris, może to być jeden z powodów, dla których klang nie jest jeszcze dostępny na tej platformie.

+1

Debian ma ten sam problem co coredumpy z powodu błędów wyrównania. – rsaxvc

+0

Clang działa teraz na Sparc64 .. powinieneś zaktualizować ten post. Wciąż jednak używa łącznika i asemblera z binutils zamiast wbudowanego w jeden. – cb88

+0

@ cb88 Wkrótce spróbuję to zbudować, a ja będę edytować moją odpowiedź z moimi wynikami. –

3

Jeśli potrzebujesz kompilatora krzyżowego dla Sparca, który działa na komputerze Ubuntu, najprostszy sposób, jaki znam, to użycie Buildroot. Here's a small tutorial o tym, jak uzyskać kompilator krzyżowy i przetestować wygenerowane pliki wykonywalne na emulatorze Sparc.

3

LLVM 3.6.2 ma pewne wsparcie dla sparc teraz ... Byłem w stanie zbudować llvm 3.6.2 i zadzwonić 3.6.2-r100 na mój T2000. Nie uzyskałem wsparcia w C++, ale stworzyłem umiarkowanie złożone aplikacje C, takie jak htop.

Zrobiłem kompilację LLVM używając gcc 5.2 jednak wersja niższa powinna również działać, chociaż zasugerowałem przynajmniej gcc 4.9 i nie mniej niż gcc 4.7.

LLVM wyłaniają się na gentoo rozbił się podczas kompilacji, ale byłem w stanie wznowić go, przesuwając do katalogu portage z ebuildów LLVM i ponownym uruchomieniu budować ręcznie:

cd /usr/portage/*/llvm/ 
ebuild llvm-3.6.2.ebuild merge 

musiałem zastąpić niektóre z domyślny kompilator:

CC="clang -target sparc-unknown-linux-gnu" 
CXX="clang++ -target sparc-unknown-linux-gnu" 
CFLAGS="-O2 -pipe" 
CXXFLAGS="${CFLAGS}" 

ja nie wiem, czy będzie w stanie to wykorzystać, aby zbudować z maszynie x86 ... choć dzyń ma być w stanie to zrobić. Ale w najgorszym przypadku możesz to zrobić w qemu-system-sparc64 vm lub na prawdziwym sprzęcie, który możesz znaleźć taniej w serwisie eBay (sprzęt T5xxx obniża cenę, a blade są tanie)

Niedawno zaktualizowany do clang 3.8 (który jest jeszcze niewydany) i udało mi się skompilować aplikację C++, przekazując -lstdC++ oprócz powyższych opcji. Wierzę, że jest to to samo zachowanie, co gcc po wywołaniu jako gcc zamiast g ++.

Powiązane problemy