2009-09-24 19 views
14

Ho una versione a 64 bit di llvm-gcc, ma voglio essere in grado di creare file binari a 32 e 64 bit. C'è una bandiera per questo? Ho provato passando -m32 (che funziona secondo il gcc regolare), ma ottengo un messaggio di errore simile a questo:Build 32-bit con llvm-gcc a 64 bit

[[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' 
... 

Questo è indietro; Voglio generare un codice a 32 bit per un processore a 64 bit!

Sto eseguendo llvm-gcc 4.2, quello fornito con Ubuntu 9.04 x86-64.


EDIT: Qui è la parte rilevante del output quando eseguo LLVM-GCC con il 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 

ho guardato in/usr/lib/LLVM/gcc- 4.2/libexec/gcc sperando di trovare un altro binario, ma l'unica directory è x86_64-linux-gnu. Probabilmente cercherò di compilare llvm-gcc dal sorgente con le opzioni appropriate in seguito.

+0

Il messaggio di errore che ottieni è davvero strano; puoi compilare con -v e pubblicare l'elenco completo degli argomenti che llvm-gcc sta effettivamente utilizzando? –

+0

Aggiornato con output dettagliato. –

risposta

5

impostazione Prova:

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

prima di compilare ...

+0

llvm-gcc ignora entrambi e crea una versione a 64 bit. –

+0

Avete installato questi: sudo apt-get install gcc-multilib libc6-i386 lib6-dev-i386? – ChristopheD

+0

Tutti questi pacchetti sono già installati. È come llvm-gcc è hardcoded per produrre output a 64 bit. –

4

Potrebbe provare questa serie di comandi e vedere se funziona? Teoricamente, se hai fornito LLVM-GCC con l'opzione -m32 questi passaggi dovrebbero essere prese da LLVM-GCC, ma forse non funziona correttamente, quindi cerchiamo di fare tutti i passi esplicito:

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 

Questa dovrebbe essere la sequenza di passi (o qualcosa di simile) che llvm-gcc esegue in modo implicito, ma sembra che nel tuo caso emetta un assembly a 64 bit per qualche motivo, quindi cerchi di assemblarlo e collegarlo a 32 bit.

+0

Questo fa quasi ciò che voglio, ma non del tutto. Anche se in effetti produce un binario a 32 bit, il mio programma di test dice che sizeof (void *) è 8, il che è molto preoccupante. –

+0

Oops, devi anche passare un gcc da m32 a llvm. Prova il nuovo set di comandi. – Falaina

+1

Questo è il problema però. llvm-gcc sta ignorando -m32. –

1

Ho avuto lo stesso problema, llvm-gcc ignora le bandiere, l'unica soluzione che ha funzionato è stata passare da llvm-gcc a clang che rispetta il -m32. Quello o passare a un sistema operativo a 32 bit per llvm-gcc funziona.

+0

Hmm, proverò a clang domani. –

+0

Non ho usato il clang all'avanguardia, o almeno non penso di averlo fatto perché avevo problemi con esso, ho usato tutto ciò che release_26 rappresenta. svn co http://llvm.org/svn/llvm-project/llvm/branches/release_26/ llvm cd llvm strumenti cd svn co http: // llvm.org/svn/llvm-project/cfe/branches/release_26/clang Fondamentalmente ho iniziato qui: http://clang.llvm.org/get_started.html –

+0

hmmm, il formmatting è stato inserito nell'ultimo commento, mi dispiace –

Problemi correlati