我有一个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'
...
这是倒退;我想为64位处理器生成32位代码!
我正在运行llvm-gcc 4.2,这是Ubuntu 9.04 x86-64附带的。
编辑:当我使用-v标志运行llvm-gcc时,以下是输出的相关部分:
[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。
答案 0 :(得分:5)
尝试设置:
export CFLAGS="-m32"
export LDFLAGS="-m32"
编译之前...
答案 1 :(得分:4)
你能尝试这一系列命令,看看它是否有效?从理论上讲,如果你使用-m32选项提供llvm-gcc,这些步骤应该由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位。
答案 2 :(得分:2)
我有同样的问题,llvm-gcc忽略了标志,唯一有效的解决方案是从llvm-gcc切换到尊重-m32的clang。那或者为llvm-gcc工作切换到32位操作系统。