Сборка 32-разрядной версии с 64-битным llvm-gcc

У меня 64-разрядная версия llvm-gcc, но я хочу иметь возможность создавать как 32-битные, так и 64-битные двоичные файлы. Есть ли флаг для этого? Я пробовал передать -m32 (который работает на регулярной 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'
...

Это назад; Я хочу создать 32-разрядный код для 64-битного процессора!

Я запускаю llvm-gcc 4.2, тот, который поставляется с Ubuntu 9.04 x86-64.


EDIT: Вот соответствующая часть вывода, когда я запускаю llvm-gcc с флагом -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

Я просмотрел /usr/lib/llvm/gcc -4.2/libexec/gcc, надеясь найти другой двоичный файл, но единственный каталог - x86_64-linux-gnu. Я, вероятно, посмотрю на компиляцию llvm-gcc из источника с соответствующими параметрами далее.

Ответы

Ответ 1

Попробуйте установить:

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

перед компиляцией...

Ответ 2

Не могли бы вы попробовать эту серию команд и посмотреть, работает ли она? Теоретически, если вы предоставили llvm-gcc с параметром -m32, эти шаги должны выполняться llvm-gcc, но, возможно, он работает некорректно, поэтому давайте сделаем все шаги явными:

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

Это должна быть последовательность шагов (или что-то подобное), которые llvm-gcc выполняет неявно, но похоже, что в вашем случае она испускает 64-битную сборку по какой-то причине, а затем пытается собрать и связать ее для 32-разрядной версии.

Ответ 3

У меня была та же проблема, llvm-gcc игнорирует флаги, единственным решением, которое работало, было переход от llvm-gcc к clang, который уважает -m32. Это или переключиться на 32-разрядную операционную систему для работы llvm-gcc.