2009-09-24 30 views
14

私は64ビット版のllvm-gccを持っていますが、私は32ビットと64ビットの両方のバイナリをビルドできます。これにはフラグがありますか?私は(通常のgccで動作する)-m32を渡そうとしましたが、次のようなエラーメッセージが表示されます。64ビットllvm-gccで32ビットをビルド

[[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' 
... 

これは後方です。私は64ビットプロセッサ用の32ビットコードを生成したい!

私は、Ubuntu 9.04 x86-64に付属のllvm-gcc 4.2を実行しています。 EDIT


:私は-vフラグとのllvm-gccのを実行したときにここでは、出力の関連する部分である:私が、/ usr/libに/ LLVM/gcc-で見

[[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 

4.2/libexec/gcc別のバイナリを探すことを望んでいますが、そこにはx86_64-linux-gnuしか存在しません。おそらくllvm-gccを適切なオプションでソースからコンパイルすることを見ていきます。

+0

エラーメッセージは本当に奇妙です。あなたは-vでコンパイルし、llvm-gccが実際に使用している完全な引数リストを投稿できますか? –

+0

冗長出力で更新されました。 –

答えて

5

てみ設定:コンパイルする前に

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

...

+0

llvm-gccはこれらの両方を無視し、64ビットバージョンを構築します。 –

+0

これらをインストールしましたか?sudo apt-get install gcc-multilib libc6-i386 lib6-dev-i386? – ChristopheD

+0

これらのパッケージはすべて既にインストールされています。それは、llvm-gccが64ビット出力を生成するためにハードコードされているようなものです。 –

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ビットでアセンブルしてリンクしようとします。

+0

これはほとんど私が望むことをしますが、それほどではありません。実際には32ビットのバイナリを生成しますが、私のテストプログラムではsizeof(void *)は8であり、非常に気になります。 –

+0

また、m32もllvm gccに渡す必要があります。新しいコマンドセットを試してみてください。 – Falaina

+1

しかしそれは問題です。 llvm-gccは-m32を無視しています。 –

1

llvm-gccはフラグを無視しますが、llvm-gccから-m32を尊重したclangに切り替えるだけです。これは、llvm-gccの作業用に32ビットオペレーティングシステムに切り替えることができます。

+0

うーん、私は明日明日に試してみます。 –

+0

私は切れ端のclangを使っていませんでした。あるいは、少なくとも私が問題を抱えていたので、私はrelease_26の略語を使用していました。 のsvn共同http://llvm.org/svn/llvm-project/llvm/branches/release_26/ LLVM CDのLLVM CDツール のsvn共同はhttp:// LLVM。org/svn/llvm-project/cfe/branches/release_26/clang 私は基本的にここから始めました: http://clang.llvm.org/get_started.html –

+0

hmmm、formmattingは最後のコメントに記載されています、ごめんなさい –

関連する問題