使用64位llvm-gcc构建32位程序

16

我有一个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位代码!但是现在出现了相反的情况。

我正在运行的是Ubuntu 9.04 x86-64附带的llvm-gcc 4.2。


编辑:当我使用-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。


你收到的错误信息非常奇怪;你能用 -v 编译并发布 llvm-gcc 实际使用的完整参数列表吗? - Stephen Canon
3个回答

8

尝试设置:

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

编译之前...


1
llvm-gcc 忽略了它们并构建了一个 64 位版本。 - Jay Conrod
你已经安装了这些吗:sudo apt-get install gcc-multilib libc6-i386 lib6-dev-i386? - ChristopheD
所有这些软件包已经安装完毕。就好像llvm-gcc已经硬编码为生成64位输出。 - Jay Conrod

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位。

这个几乎实现了我想要的功能,但还不太完美。虽然它确实生成了一个32位二进制文件,但我的测试程序显示sizeof(void*)为8,这非常令人担忧。 - Jay Conrod
抱歉,你还需要向 LLVM GCC 传递一个 m32。尝试使用新的命令集。 - Falaina
1
问题在于这里。llvm-gcc正在忽略-m32参数。 - Jay Conrod
1
忽略了初始的-m32,因此test.bc具有64位项。从那时起,工具可以正常工作,只需要解决64位函数的问题。最后的gcc -m32将抱怨找不到某些64位函数的库,这取决于目标和编译器/交叉编译器。 - old_timer

3

我曾遇到相同的问题,llvm-gcc 忽略了标志,唯一可行的解决方案是从 llvm-gcc 切换到 clang,clang 可以尊重 -m32 标志。或者切换到 32 位操作系统,以便让 llvm-gcc 正常工作。


嗯,明天我会试试clang。 - Jay Conrod
1
我没有使用尖端的clang,或者至少我认为我没有使用它,因为我遇到了一些问题,我一直在使用release_26代表的内容。svn co http://llvm.org/svn/llvm-project/llvm/branches/release_26/ llvm cd llvm cd tools svn co http://llvm.org/svn/llvm-project/cfe/branches/release_26/ clang我基本上是从这里开始的: http://clang.llvm.org/get_started.html - old_timer
抱歉,最后一条评论的格式出了问题。 - old_timer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接