【问题标题】:Compile, Assemble and Disassemble Using the LLVM Tool Chain使用 LLVM 工具链编译、汇编和反汇编
【发布时间】:2012-01-03 19:56:16
【问题描述】:

我正在尝试运行以下example 来使用 LLVM 工具链编译、汇编和反汇编一个小程序。

我的目的是了解它是如何工作的,因此在进一步的尝试中,我可以通过更改和/或重新排序组件的说明来进行一些性能测试。

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

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

一旦我有了咬代码,我尝试使用 llvm-dis 实用程序查看 LLVM 汇编代码,并使用 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

提前致谢。

【问题讨论】:

  • llvm-gcc 已弃用。可以试试clang吗?
  • 我也有类似的问题。你解决了吗???

标签: llvm


【解决方案1】:

确保您的 llvm-gcc 版本与您安装的 LLVM 版本相匹配 - 二进制 IR 格式变化非常快,并且不向后兼容多个版本。

或者,您可以尝试从 llvm-gcc 发出 LLVM IR 的 text 表示,并通过 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

等等

【讨论】:

    猜你喜欢
    • 2016-03-25
    • 1970-01-01
    • 2015-12-21
    • 1970-01-01
    • 2011-03-12
    • 2012-05-08
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多