2009-09-24 17 views
14

J'ai une version 64 bits de llvm-gcc, mais je veux être capable de construire des binaires 32 bits et 64 bits. Y a-t-il un drapeau pour ça? J'ai essayé passer -m32 (qui fonctionne sur le gcc), mais je reçois un message d'erreur comme ceci:Construire 32 bits avec llvm-gcc 64 bits

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

C'est en arrière; Je veux générer du code 32 bits pour un processeur 64 bits!

Je cours llvm-gcc 4.2, celui qui vient avec Ubuntu 9.04 x86-64.


EDIT: Voici la partie pertinente de la sortie lorsque je lance LLVM-gcc avec le drapeau -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 

J'ai regardé dans/usr/lib/LLVM/GCC- 4.2/libexec/gcc espérant trouver un autre binaire, mais le seul répertoire est x86_64-linux-gnu. Je vais probablement regarder la compilation de llvm-gcc depuis la source avec les options appropriées ensuite.

+0

Le message d'erreur que vous obtenez est vraiment étrange; pouvez-vous compiler avec -v et afficher la liste complète des arguments utilisés par llvm-gcc? –

+0

Mis à jour avec la sortie détaillée. –

Répondre

5

réglage Essayez:

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

avant de compiler ...

+0

llvm-gcc ignore les deux et construit une version 64 bits. –

+0

Avez-vous installé ceux-ci: sudo apt-get install gcc-multilib libc6-i386 lib6-dev-i386? – ChristopheD

+0

Tous ces packages sont déjà installés. C'est comme si llvm-gcc est codé en dur pour produire une sortie 64 bits. –

4

Pourriez-vous essayer cette série de commandes et de voir si cela fonctionne? En théorie, si vous avez fourni LLVM-gcc avec l'option -m32 ces mesures devraient être prises par LLVM-gcc, mais peut-être il ne fonctionne pas correctement, donc nous allons faire toutes les étapes explicites:

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 

Cela devrait être la séquence étapes (ou quelque chose de similaire) que llvm-gcc effectue implicitement, mais il semble que dans votre cas, il émet un assembly 64 bits pour une raison quelconque, puis essayer de l'assembler et de le lier pour 32 bits.

+0

Cela fait presque ce que je veux, mais pas tout à fait. Bien qu'il produise en fait un binaire 32 bits, mon programme de test dit que sizeof (void *) est de 8, ce qui est très inquiétant. –

+0

Oups, vous devez également passer un mcc à llvm gcc aussi. Essayez le nouvel ensemble de commandes. – Falaina

+1

C'est le problème cependant. llvm-gcc ignore ignorer -m32. –

1

J'ai eu le même problème, llvm-gcc ignore les drapeaux, la seule solution qui a fonctionné était de passer de llvm-gcc à clang qui respecte le -m32. Cela ou passer à un système d'exploitation 32 bits pour le travail llvm-gcc.

+0

Hmm, j'essaierai clang demain. –

+0

Je n'ai pas utilisé le clang tranchant, ou au moins ne pense pas que j'ai fait comme j'ai eu des problèmes avec lui, j'ai utilisé tout ce que signifie release_26. svn co http://llvm.org/svn/llvm-project/llvm/branches/release_26/ llvm cd llvm outils cd svn co http: // llvm.org/svn/llvm-projet/cfe/branches/release_26/clang J'ai fondamentalement commencé ici: http://clang.llvm.org/get_started.html –

+0

hmmm, formmatting est arrosé dans le dernier commentaire, désolé –