objdump and ARM vs Thumb

10

我正在尝试使用gcc反汇编一个针对ARM构建的对象。不幸的是,objdump试图猜测代码是ARM还是Thumb,并且猜错了:它认为我的代码是Thumb,实际上它是ARM。

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

这对我来说似乎是一个非常奇怪的遗漏,而且这严重影响了我的工作能力(我在嵌入式设备上,我的唯一调试方法是查看反汇编代码)。我尝试过各种方法,包括尝试告诉objdump使用不支持Thumb的ARM架构,但是似乎没有任何办法。有什么想法吗?

(是的,我知道这些指令确实是ARM...)


你是否在剥离二进制(ELF)文件,可能信息曾经存在但被删除了。或者你需要添加一个开关来将调试信息包含到二进制文件中。 - old_timer
1
今天是 objdump ... -Mno-force-thumb。无法确定这是否在2011年就存在了。基本上它要么是ARM,要么是Thumb,因此当你说 no-force-thumb 时,指令集是ARM。 - JSmyth
2个回答

5

arm-linux-gnueabi-objdump -marm -b binary -D对我很管用。虽然它没有保存符号信息,所以它不完全是你要找的东西,但它可以给你反汇编,这是一个开始。


-1

这听起来像是编译器/链接器或 objdump 中的一个 bug。通常,如果符号是 Thumb 或 ARM,则应该正确标记并相应地反汇编。

话虽如此,您可以尝试以下几件事:

  1. 将文件解释为普通二进制文件(-b binary -D)- 这将禁用符号检查,并将整个文件作为 ARM 反汇编。缺点:输出中有大量垃圾,没有漂亮的地址。
  2. 使用 IDA Pro。即使它猜错了,您也可以覆盖它的决定。另外,这是一种更好的反汇编环境 :)

我需要符号信息以便知道我在看什么,因此使用原始二进制文件是不够的,恐怕不行。所涉及的文件确实具有调试信息,因此标记信息应该在那里。我的构建过程很复杂,但始终涉及gcc;您有什么想法可能会剥离符号标记吗? - David Given
很难说问题出在哪里。打印符号表的内容并查看arm-dis.c中的print_insn(_arm)。也许这会给你一些想法。 - Igor Skochinsky

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