Assembly 对象和手臂与拇指

Assembly 对象和手臂与拇指,assembly,arm,objdump,binutils,thumb,Assembly,Arm,Objdump,Binutils,Thumb,我正在尝试用gcc分解为ARM构建的对象。不幸的是,objdump试图猜测代码是否是ARM和Thumb,并且弄错了:它认为我的代码是Thumb,而实际上是ARM 我看到objdump有一个选项可以强制它将所有指令解释为Thumb(-Mforce Thumb),但它没有强制ARM模式的选项 这对我来说似乎是一个非常奇怪的遗漏,它严重阻碍了我完成工作的能力(我在一个嵌入式设备上,我唯一的调试方法就是查看反汇编)。我尝试过各种方法,包括尝试告诉objdump使用不支持Thumb的ARM架构,但似乎没有

我正在尝试用gcc分解为ARM构建的对象。不幸的是,objdump试图猜测代码是否是ARM和Thumb,并且弄错了:它认为我的代码是Thumb,而实际上是ARM

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

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


(是的,我知道指令实际上是ARM…

这听起来像是编译器/链接器或objdump中的错误。通常,如果符号是拇指或手臂,则应正确标记符号,并相应地进行拆解

也就是说,有几件事你可以尝试:

  • 将文件解释为普通二进制(-b binary-D)-这将禁用符号检查,并将整个文件分解为ARM。缺点:输出中有很多垃圾,没有好的地址
  • 使用。即使它猜错了,你也可以推翻它的决定。另外,它是一个更好的反汇编环境:)

  • armlinux-gnueabi-objdump-marm-b-binary-D
    帮了我一把。虽然它没有保留符号信息,因此它不是您想要的,但它提供了反汇编功能,这是一个开始。

    您是否正在剥离二进制(elf)文件,可能信息就在那里,然后被删除。或者你必须添加一个开关,将调试信息包含到二进制文件中-Mno今天强制使用拇指。不能说这在2011年是否存在。基本上它是ARM或Thumb,所以当你说
    no force Thumb
    时,指令集是ARM。我需要符号信息,这样我就知道我在看什么,所以恐怕使用原始二进制文件不会剪切它。有问题的文件确实有调试信息,因此标记信息应该在那里。我的构建过程很复杂,但始终涉及gcc;有什么想法可以去掉符号标记吗?很难说到底是什么问题。打印符号表的内容,并查看arm dis.c中的Print_insn(_arm)。也许这会给你一些想法。