disassembly - 在 ARMv8 中为 objdump 反汇编器定义代码偏移量

标签 disassembly arm64 objdump

我有一个包含 ARM v8 二进制代码的文件。我想反汇编文件并获取其中包含的实际汇编代码。

假设文件名是 tmp.o 我运行:

/opt/linaro/A64-tools/bin/aarch64-linux-gnu-objdump -b binary -m AARCH64 -D tmp.o

这给了我正确的反汇编。但是,分支指令的偏移量假定此代码位于地址 0x00000000 中。

如果我知道代码将位于内存中的地址 0x12345678 中:
  • 有没有办法告诉 objdump 使用这个地址作为起始地址?
  • 如果没有,我可以在二进制文件中添加一些 header ,其内容如下:

    . = 0x12345678

  • 提前致谢..

    最佳答案

    快速浏览一下就会发现 objdump 的 --adjust-vma 选项,它似乎正是这样做的。

    使用手头的第一个原始二进制文件:

    $ aarch64-linux-gnu-objdump -b binary -m aarch64 -D arch/arm64/boot/Image
    
    arch/arm64/boot/Image:     file format binary
    
    
    Disassembly of section .data:
    
    0000000000000000 <.data>:
           0:       91005a4d        add     x13, x18, #0x16
           4:       140003ff        b       0x1000
    ...
    

    对比
    $ aarch64-linux-gnu-objdump -b binary -m aarch64 --adjust-vma=0x12345678 -D arch/arm64/boot/Image
    
    arch/arm64/boot/Image:     file format binary
    
    
    Disassembly of section .data:
    
    0000000012345678 <.data>:
        12345678:   91005a4d        add     x13, x18, #0x16
        1234567c:   140003ff        b       0x12346678
    ...
    

    关于disassembly - 在 ARMv8 中为 objdump 反汇编器定义代码偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30460004/

    相关文章:

    c - .text 和 .fini 数据段之间的空格?

    c - 堆栈中奇怪的指针位置

    qemu - 对模拟代码中字节顺序的重要性非常困惑

    linux - GCC 编译代码 : why integer declaration needs several statements?

    linux - 具有 arm64 架构的 QEMU 上的 Xen

    ios - 为什么我的应用程序只构建 arm64 slice?

    c++ - 通过 objdump 链接没有头文件的 so 库

    linux - 反汇编/proc/kcore时,objdump和udis86产生不同的输出

    c - 静态链接不在库 api strlen() 和 puts() 的 gdb 中提供代码

    c# - if 语句不正确 - 反汇编对我来说没有任何解释