Сборка 32-битной версии с помощью 64-битной версии llvm-gcc

У меня есть 64-разрядная версия llvm-gcc, но я хочу иметь возможность создавать как 32-разрядные, так и 64-разрядные двоичные файлы. Есть ли для этого флаг? Я попытался передать -m32 (который работает на обычном gcc), но получаю сообщение об ошибке, подобное этому:

[jay@andesite]$ 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:

[jay@andesite]$ 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 из исходного кода с соответствующими параметрами.


person Jay Conrod    schedule 24.09.2009    source источник
comment
Сообщение об ошибке, которое вы получаете, действительно странное; можете ли вы скомпилировать с -v и опубликовать полный список аргументов, который на самом деле использует llvm-gcc?   -  person Stephen Canon    schedule 25.09.2009


Ответы (3)


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

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

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

person ChristopheD    schedule 24.09.2009
comment
llvm-gcc игнорирует оба из них и создает 64-битную версию. - person Jay Conrod; 25.09.2009
comment
Вы установили это: sudo apt-get install gcc-multilib libc6-i386 lib6-dev-i386? - person ChristopheD; 25.09.2009
comment
Все эти пакеты уже установлены. Это похоже на то, что llvm-gcc жестко закодирован для получения 64-битного вывода. - person Jay Conrod; 25.09.2009

Не могли бы вы попробовать эту серию команд и посмотреть, работает ли она? Теоретически, если вы предоставили 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-битной.

person Falaina    schedule 25.09.2009
comment
Это почти делает то, что я хочу, но не совсем. Хотя на самом деле он создает 32-битный двоичный файл, моя тестовая программа говорит, что sizeof(void*) равен 8, что очень настораживает. - person Jay Conrod; 25.09.2009
comment
К сожалению, вам также нужно передать m32 в llvm gcc. Попробуйте новый набор команд. - person Falaina; 01.10.2009
comment
Но это проблема. llvm-gcc игнорирует -m32. - person Jay Conrod; 01.10.2009
comment
начальный -m32 игнорируется, поэтому test.bc содержит 64-битные элементы. С этого момента инструменты работают, им просто нужны решения для 64-битных функций. gcc -m32 в конце будет жаловаться на то, что библиотека для какой-то 64-битной функции не найдена, в зависимости от цели и компилятора/кросс-компилятора. - person old_timer; 03.10.2009

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

person old_timer    schedule 01.10.2009
comment
Хм, я попробую clang завтра. - person Jay Conrod; 01.10.2009
comment
Я не использовал передний лязг, или, по крайней мере, не думаю, что использовал его, поскольку у меня были проблемы с ним, я использовал то, что означает release_26. svn co llvm.org/svn/llvm-project/llvm/branches/release_26 llvm cd llvm cd tools svn co llvm.org/svn/ llvm-project/cfe/branches/release_26 clang Я в основном начал здесь: clang.llvm.org /get_started.html - person old_timer; 01.10.2009
comment
хм, в последнем комменте форматирование залито, извините - person old_timer; 01.10.2009