2012-01-03 45 views
6

我试图运行以下example以使用LLVM工具链编译,汇编和反汇编小程序。使用LLVM工具链编译,组装和反汇编

我的目的是了解它是如何工作的,所以在进一步的尝试中,我可以通过改变和/或重新排序组装指令来做一些性能测试。

首先,我先得到一个虚拟程序的咬代码:

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

一旦我有一口代码,我尝试使用LLVM-DIS工具来看看LLVM的汇编代码和LLC编译程序返回到本地组装使用LLC代码生成器(只是为了试图摇动):

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

但在这两种情况下,我得到以下错误:

llvm-dis: Invalid MODULE_CODE_GLOBALVAR record 

有关如何解决此问题的任何想法?

我已经使用Google搜索,但我还没有找到解决方案。我也尝试过使用

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 2012-01-04 08:23:55

+1

我有类似的问题。你有没有解决它? – Cartesius00 2012-08-11 12:05:55

回答

5

请确保您的llvm-gcc版本与您安装的LLVM版本相匹配 - 二进制IR格式更改速度相当快,并且在多个版本中不会向后兼容。

或者,你可以尝试发射文本LLVM IR的表示了LLVM-GCC,并通过LLVM,作为组装。

事情是这样的:

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