objdump和ARM与拇指

问题描述:

我试图用gcc反汇编为ARM构建的对象。不幸的是,objdump试图猜测代码是否是ARM和Thumb,并且是错误的:它认为我的代码是Thumb,而实际上是ARM。objdump和ARM与拇指

我看到objdump有一个选项来强制它将所有指令解释为Thumb(-Mforce-thumb),但它没有强制ARM模式!

这对我来说似乎是一个非常奇怪的遗漏,它严重妨碍了我完成工作的能力(我在嵌入式设备上,而我唯一的调试手段就是查看反汇编)。我尝试了各种方法,包括试图告诉objdump使用不支持Thumb的ARM体系结构,但似乎没有任何工作。有任何想法吗?

(是的,我知道,指示真的是 ARM ...)

+0

你是剥离二进制(精灵)文件,也许信息在那里,然后删除。或者,也许你必须添加一个开关来将调试信息包含到二进制文件中。 –

+0

今天是'objdump ... -Mno-force-thumb'。不能说这是否在2011年出现。本质上它是ARM或Thumb,所以当你说'no-force-thumb'时,指令集是ARM。 – JSmyth

这听起来像是在任一编译器/连接或objdump的一个bug。通常,如果符号是Thumb或ARM并且相应地进行反汇编,则应该标记符号。

这就是说,有一些事情你可以尝试:

  1. 解释文件作为纯二进制(-b二进制-D) - 这将禁用标志检查,并拆卸整个文件作为ARM。下行:输出中有大量垃圾,没有很好的地址。使用IDA Pro。即使它猜错了,你也可以随时忽略它的决定。此外,这是一个好得多的拆卸环境:)
+0

我需要符号信息,所以我知道我在看什么,所以使用原始二进制不会削减它,恐怕。有问题的文件确实有调试信息,所以标记信息应该在那里。我的构建过程令人费解,但确实涉及gcc;任何想法可能会剥离符号标记? –

+0

很难说这个问题到底是什么。打印符号表的内容并查看arm-dis.c中的print_insn(_arm)。也许这会给你一些想法。 –

arm-linux-gnueabi-objdump -marm -b binary -D的伎俩我。虽然它并不保留符号信息,但它不是你正在寻找的东西,但它可以让你进行反汇编,这是一个开始。