小编gta*_*gil的帖子

使用LLVM工具链编译,组装和反汇编

我正在尝试使用LLVM工具链运行以下示例来编译,组装和反汇编一个小程序.

我的目的是学习它是如何工作的,所以在进一步尝试中,我可以通过更改和/或重新排序assmbly的指令来进行一些性能测试.

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

    % llvm-gcc -O3 -emit-llvm hello.c -c -o hello.bc
Run Code Online (Sandbox Code Playgroud)

一旦我有了咬代码,我尝试使用llvm-dis实用程序来查看LLVM汇编代码和llc,使用LLC代码生成器将程序编译回本机程序集(仅用于尝试的动摇):

    % llvm-dis < hello.bc | less
    % llc hello.bc -o hello.s
Run Code Online (Sandbox Code Playgroud)

但在这两种情况下我都会收到以下错误:

    llvm-dis: Invalid MODULE_CODE_GLOBALVAR record
Run Code Online (Sandbox Code Playgroud)

关于如何解决这个问题的任何想法?

我用谷歌搜索,我还没有找到解决方案.我也试过用

    otool -tV hello
Run Code Online (Sandbox Code Playgroud)

但是输出与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
Run Code Online (Sandbox Code Playgroud)

我明白了:

__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 …
Run Code Online (Sandbox Code Playgroud)

llvm

6
推荐指数
1
解决办法
5866
查看次数

标签 统计

llvm ×1