2015-10-05 144 views
2

在我的一个(FWIW,ARM)调试会话期间,我注意到GDB和objdump -S的源交错反汇编输出在一个有趣的方面有所不同:objdump似乎是跳过单个/一组指令和显示生成这些指令的源代码行(指令顺序)。另一方面,GDB反汇编似乎跳过源代码行,并列出从该源代码行生成的所有汇编指令(源订单)。来自GDB和objdump的源交错反汇编

对于-O0代码,两个程序的输出看起来都是一样的。但是,对于优化的代码,GDB的反汇编更有帮助,因为它将所有那些分散的指令集中在一起,因此很容易看到单独的源代码行生成的内容(显然,在这种情况下,指令地址不会连续)。

我认为这两种形式对他们都有帮助。我的问题是两个程序的显示行为是否可配置。 IOW,我可以告诉GDB像objdump那样显示,或者告诉objdump像GDB一样显示吗?此外,还有其他工具可以执行这个壮举吗?

TIA。

回答

1

我不认为有任何方法可以改变objdump的行为,但是最近gdb中增加了一项功能,可以按指令顺序显示交错源代码。此功能非常新,尚未发布,但您可以看到修补程序herehere

有了这些补丁,旧标志/m仍以程序源代码行顺序拆卸,而新标志/s按指令顺序拆卸。长期计划是删除/m,因为它在某些边缘情况下被破坏,并且不被认为值得修复。

+0

谢谢你。这是否意味着GDB的源代码交错拆解能力将完全消失?这会让我担心。 – Jeenu

+1

不,'/ m'会有一天(可能很长一段时间)被删除,但是'/ s'会保留。你仍然可以得到源代码+指令,只是按指令地址命令'/ s'。 – Andrew

+0

这将是一个无赖。从我所收集的内容来看,'/ m'是按源排序的反汇编的唯一方式(证明它非常有用,即使它有一些边界情况)。我希望从现在开始真的很长一段时间。 – Jeenu