2009-09-24 31 views
14

Tengo una versión de llvm-gcc de 64 bits, pero quiero poder compilar tanto archivos binarios de 32 bits como de 64 bits. ¿Hay una bandera para esto? He intentado pasar -m32 (que trabaja en el gcc regular), pero me da un mensaje de error como este:Compilación de 32 bits con llvm-gcc de 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' 
... 

Esto es al revés; ¡Quiero generar código de 32 bits para un procesador de 64 bits!

Estoy ejecutando llvm-gcc 4.2, el que viene con Ubuntu 9.04 x86-64.


EDIT: Aquí es la parte pertinente de la salida cuando corro llvm-gcc con la bandera -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 

Miré en/usr/lib/llvm/GCC 4.2/libexec/gcc esperando encontrar otro binario, pero el único directorio es x86_64-linux-gnu. Probablemente veré la compilación de llvm-gcc de la fuente con las opciones apropiadas a continuación.

+0

El mensaje de error que está recibiendo es realmente extraño; ¿se puede compilar con -v y publicar la lista completa de argumentos que llvm-gcc está usando? –

+0

Actualizado con salida detallada. –

Respuesta

5

entorno Probar:

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

antes de compilar ...

+0

llvm-gcc ignora ambos y crea una versión de 64 bits. –

+0

¿Ha instalado estos: sudo apt-get install gcc-multilib libc6-i386 lib6-dev-i386? – ChristopheD

+0

Todos esos paquetes ya están instalados. Es como si llvm-gcc estuviera codificado para producir una salida de 64 bits. –

4

Podría probar esta serie de comandos y ver si funciona? Teóricamente si proporcionó llvm-gcc con la opción -m32 estos pasos deben ser tomadas por llvm-gcc, pero tal vez no está funcionando correctamente, por lo que vamos a hacer todos los pasos explícita:

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 

Ésta debe ser la secuencia de Pasos (o algo similar) que llvm-gcc realiza implícitamente, pero parece que en su caso está emitiendo un ensamblaje de 64 bits por algún motivo, y luego intenta ensamblarlo y vincularlo para 32 bits.

+0

Esto casi hace lo que quiero, pero no del todo. Aunque de hecho produce un binario de 32 bits, mi programa de prueba dice que sizeof (void *) es 8, lo cual es muy preocupante. –

+0

Vaya, también debe pasar un gcc m32 a llvm también. Pruebe el nuevo conjunto de comandos. – Falaina

+1

Ese es el problema sin embargo. llvm-gcc está ignorando -m32. –

1

Tuve el mismo problema, llvm-gcc ignora las banderas, la única solución que funcionó fue cambiar de llvm-gcc a clang que respeta el -m32. Eso o cambiar a un sistema operativo de 32 bits para el trabajo de llvm-gcc.

+0

Hmm, voy a probar el clang mañana. –

+0

No utilicé el clang de vanguardia, o al menos no creo haberlo hecho ya que tuve problemas con él, he estado usando lo que sea que signifique el lanzamiento_26. svn co http://llvm.org/svn/llvm-project/llvm/branches/release_26/ llvm cd llvm herramientas de cd svn co http: // llvm.org/svn/llvm-project/cfe/branches/release_26/clang Básicamente comencé aquí: http://clang.llvm.org/get_started.html –

+0

hmmm, formmatting está sucio en el último comentario, lo siento –

Cuestiones relacionadas