15

我有 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。

4

3 回答 3

8

尝试设置:

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

在编译之前...

于 2009-09-24T22:06:04.623 回答
4

你可以试试这一系列的命令,看看它是否有效?理论上,如果您为 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 位。

于 2009-09-25T15:41:17.110 回答
3

我遇到了同样的问题,llvm-gcc 忽略了标志,唯一有效的解决方案是从 llvm-gcc 切换到确实尊重 -m32 的 clang。那或者切换到 32 位操作系统来进行 llvm-gcc 工作。

于 2009-10-01T01:03:07.240 回答