2009-09-24 11 views
14

Mam 64-bitową wersję llvm-gcc, ale chcę mieć możliwość tworzenia zarówno 32-bitowych, jak i 64-bitowych plików binarnych. Czy jest na to flaga? Próbowałem przejść -m32 (który działa na zwykłym gcc), ale pojawia się komunikat o błędzie podobny do tego:Kompilacja 32-bitowa z 64-bitowym llvm-gcc

[[email protected]]$ llvm-gcc -m32 test.c -o test 
Warning: Generation of 64-bit code for a 32-bit processor requested. 
Warning: 64-bit processors all have at least SSE2. 
/tmp/cchzYo9t.s: Assembler messages: 
/tmp/cchzYo9t.s:8: Error: bad register name `%rbp' 
/tmp/cchzYo9t.s:9: Error: bad register name `%rsp' 
... 

To jest wstecznie; Chcę wygenerować 32-bitowy kod dla procesora 64-bitowego!

Używam llvm-gcc 4.2, ten, który jest dostarczany z Ubuntu 9.04 x86-64.


EDIT: Oto odpowiednia część wyjściu gdy biegnę LLVM-gcc z flagą -v:

[[email protected]]$ llvm-gcc -v -m32 test.c -o test.bc 
Using built-in specs. 
Target: x86_64-linux-gnu 
Configured with: ../llvm-gcc4.2-2.2.source/configure --host=x86_64-linux-gnu --build=x86_64-linux-gnu --prefix=/usr/lib/llvm/gcc-4.2 --enable-languages=c,c++ --program-prefix=llvm- --enable-llvm=/usr/lib/llvm --enable-threads --disable-nls --disable-shared --disable-multilib --disable-bootstrap 
Thread model: posix 
gcc version 4.2.1 (Based on Apple Inc. build 5546) (LLVM build) 
/usr/lib/llvm/gcc-4.2/libexec/gcc/x86_64-linux-gnu/4.2.1/cc1 -quiet -v -imultilib . test.c -quiet -dumpbase test.c -m32 -mtune=generic -auxbase test -version -o /tmp/ccw6TZY6.s 

Spojrzałem w/usr/lib/LLVM/gcc- 4.2/libexec/gcc mając nadzieję znaleźć inny plik binarny, ale jedynym katalogiem jest x86_64-linux-gnu. Prawdopodobnie przyjrzę się kompilacji llvm-gcc ze źródła przy odpowiednich opcjach.

+0

Komunikat o błędzie, który otrzymujesz, jest naprawdę dziwny; czy możesz skompilować z opcją -v i opublikować pełną listę argumentów, której używa llvm-gcc? –

+0

Zaktualizowano z pełnym wyjściem. –

Odpowiedz

5

ustawienie Spróbuj:

export CFLAGS="-m32" 
export LDFLAGS="-m32" 

przed kompilacją ...

+0

llvm-gcc ignoruje oba te i buduje wersję 64-bitową. –

+0

Czy zainstalowałeś te: sudo apt-get install gcc-multilib libc6-i386 lib6-dev-i386? – ChristopheD

+0

Wszystkie te pakiety są już zainstalowane. To tak, jakby llvm-gcc został zakodowany na stałe w celu uzyskania wyjścia 64-bitowego. –

4

można spróbować tę serię poleceń i sprawdzić, czy to działa? Teoretycznie, jeśli warunkiem LLVM-gcc z opcją -m32 te kroki powinny być podjęte przez LLVM-gcc, ale może to nie działa prawidłowo, więc zróbmy wszystkie kroki wyraźne:

llvm-gcc -m32 -emit-llvm test.c -c -o test.bc 
llc test.bc -march=x86 -o test.S 
gcc test.S -m32 -o test 

ta powinna być sekwencja kroki (lub coś podobnego), które llvm-gcc wykonuje niejawnie, ale wygląda na to, że z jakiegoś powodu emituje 64-bitowy zestaw, a następnie próbuje złożyć i połączyć go dla 32-bitów.

+0

To prawie robi to, co chcę, ale nie całkiem. Chociaż w rzeczywistości generuje 32-bitowy plik binarny, mój program testowy mówi, że sizeof (void *) to 8, co jest bardzo niepokojące. –

+0

Ups, również musisz przekazać m32 do llvm gcc. Wypróbuj nowy zestaw poleceń. – Falaina

+1

To jednak problem. llvm-gcc ignoruje -m32. –

1

Miałem ten sam problem, llvm-gcc ignoruje flagi, jedynym rozwiązaniem było przejście z llvm-gcc do clang, które respektuje -m32. To lub przełącz się na 32-bitowy system operacyjny dla pracy llvm-gcc.

+0

Hmm, jutro wypróbuję jutro. –

+0

Nie użyłem klang krawędź, lub przynajmniej nie sądzę, że zrobiłem, jak miałem problemy z tym, używam cokolwiek release_26 oznacza. svn co http://llvm.org/svn/llvm-project/llvm/branches/release_26/ llvm cd llvm narzędzi cd svn co http: // llvm.org/svn/llvm-project/cfe/branches/release_26/clang Zasadniczo zacząłem tutaj: http://clang.llvm.org/get_started.html –

+0

hmmm, formmatting został napisany w ostatnim komentarzu, przepraszam –