2012-01-03 25 views
6

LLVMツールチェーンを使用してコンパイル、アセンブル、逆アセンブルするには、次のように実行しようとしています:exampleLLVMツールチェーンを使用したコンパイル、アセンブル、逆アセンブル

私の意図は、それがどのように動作するかを学ぶことです。私は、assmblyの指示を変更および/または並べ替えることによって、パフォーマンステストを行うことができます。で開始する

、私が最初にダミーのプログラムの一口コードを取得:私は一口コードを持っていたら

% llvm-gcc -O3 -emit-llvm hello.c -c -o hello.bc 

を、私はLLVMアセンブリを見てみることをLLVM-DISユーティリティを使用してみてくださいコードとLLC(ちょうどしようとするの揺れのために)LLCコードジェネレータを使用してバックネイティブアセンブリに、プログラムをコンパイルする:

% llvm-dis < hello.bc | less 
    % llc hello.bc -o hello.s 

しかし、両方のケースで、私は次のエラーを取得する:

llvm-dis: Invalid MODULE_CODE_GLOBALVAR record 

この問題を解決する方法はありますか?

私はグーグルで、私は解決策を見つけられませんでした。私も使用しようとしました

otool -tV hello 

しかし出力はllvmと互換性がありません。代わりに、次のアセンブリ形式取得する:

.section __TEXT,__text,regular,pure_instructions 
.globl _main 
.align 4, 0x90 
    _main: 
    Leh_func_begin1: 
pushq %rbp 
    Ltmp0: 
movq %rsp, %rbp 
    Ltmp1: 
subq $16, %rsp 
    Ltmp2: 
leaq L_.str(%rip), %rax 

を私が取得:

私の猫は、例えばと、後者のアセンブリをコンパイルすると私のために有効ではありません
__TEXT,__text) section 
start: 
0000000100000eb0 pushq $0x00 
0000000100000eb2 movq %rsp,%rbp 
0000000100000eb5 andq $0xf0,%rsp 
0000000100000eb9 movq 0x08(%rbp),%rdi 
0000000100000ebd leaq 0x10(%rbp),%rsi 
0000000100000ec1 movl %edi,%edx 
0000000100000ec3 addl $0x01,%edx 

% gcc hello.s -o hello.native 

感謝あらかじめ。

+4

LLVM-GCCが廃止されました。あなたは強くなることができますか? – arrowd

+1

私は同様の問題があります。あなたは何とかそれを解決しましたか? – Cartesius00

答えて

5

llvm-gccのバージョンが、インストールしたLLVMのバージョンと一致していることを確認してください。バイナリIRフォーマットはかなり高速に変更され、いくつかのバージョンで下位互換性がありません。

または LLVM IRからllvm-gccの表現を取り出し、llvm-asを使用して組み立てようとする可能性があります。このような

何か:

llvm-gcc -emit-llvm -S foo.c -o foo.ll 
llvm-as foo.ll -o foo.bc 
llc foo.ll -o foo.S 

など

関連する問題