使用objdump进行ARM架构的反汇编:将其反汇编为ARM指令

21

我有一个目标文件,想要进行反汇编。当我使用:

objdump -d example.o

我在代码中得到一个 elf64-x86-64 文件格式的汇编代码。

我想将其反汇编为ARM,应该如何操作?


只是想澄清一下,您的意思是您有一个x86_64可执行文件/目标文件,并希望将其反汇编为ARM指令吗? - dmckee --- ex-moderator kitten
是的,我的教授让我做一个项目,我想要做的是反汇编目标文件,但我猜它是一个x86可执行文件。如果我使用arm-linux-objdump,我应该能够将其反汇编为ARM,对吗? - Steve
2
为了编译和反汇编,您需要使用ARM交叉编译器工具链。 - Jagdish
6个回答

20

如果您想要对ARM代码进行反汇编,最好先拥有一个ARM工具链,以下是我找到的:

http://bb.osmocom.org/trac/wiki/toolchain

一旦您安装了它,就可以使用 arm-elf-objdump 而不是 objdump。 我使用的命令是:

arm-elf-objdump -D -b binary -marm binaryfile.dat

如果您查看手册页,您会发现“-b”后面跟着文件类型。抱歉,我不知道如何告诉-b您想分析一个.o文件。“-marm”将告诉CPU是ARM。

希望这可以帮助您。


5
现在你只需要通过sudo apt install gcc-arm-none-eabi来安装它,然后使用gcc-arm-none-eabi-objdump -d -marm <binary>来反汇编ARM二进制文件。 - borizzzzz
5
在我的情况下(Ubuntu 18.04),gcc-arm-none-eabi-objdump 不起作用,但是 arm-none-eabi-objdump 能够正常工作。 - lonelyjoe

8
在拆卸二进制文件之前,请通过"file"检查文件类型,例如:

file dnslookup.o

dnslookup.o:ELF 32位LSB relocatable,ARM,EABI5版本1(SYSV),未剥离

所以现在我们知道它是一个ARM对象或ELF文件。
要反汇编ARM对象文件,请使用arm-linux-gnueabi-objdump。在Ubuntu中,“arm-linux-gnueabi-objdump”是ARM二进制文件的默认反汇编程序-无需编译。
要安装它,只需执行:

sudo apt-get install binutils-arm-linux-gnueabi

此软件包中还有其他可以进一步分析ARM二进制文件的二进制文件。

7

使用正确的目标编译binutils,以获取可反汇编ARM的binutils objdump二进制文件。

http://www.gnu.org/software/binutils/

例如:./configure --enable-targets=all

选择您的目标,制作并使用新的objdump二进制文件,该文件具有针对您的目标的意识。有关定位更多信息,请参见binutils/README文件。

objdump -D t3c # stock binary
objdump: t3c: File format not recognized

对抗

./../../binutils-2.22/binutils/objdump -D t3c # latest compiled from source with all targets
In archive t3c:

t3c:arm:     file format mach-o-le


Disassembly of section .text:

00002d94 <start>:
    2d94:   e59d0000    ldr r0, [sp]
...

4
安装ELDK并使用arm-linux-objdump。您正在尝试使用仅了解x86的程序来反汇编ARM指令。

0
我正在使用Debian 12。所以我安装了Debian的arm反汇编工具arm-trusted-firmware-tools
sudo apt install arm-trusted-firmware-tools

之后,我使用与上述相似的命令(qiuhan1989),并将文件保存为.asm格式。
arm-none-eabi-objdump -D -b binary -marm binary.elf > binary.elf.asm

0

我在 macOS (arm64) 上遇到了这个问题。由于某种原因,configure 工具从 Xcode SDK 中找到了 objdump,而我并没有进行交叉编译,所以 Xcode 必须也包含 Intel 二进制文件。

我所需要做的就是执行 brew install binutils – 问题解决了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接