为什么otool会截断我的反汇编输出?

时间:2017-01-20 19:36:24

标签: macos lldb disassembly mach-o otool

当我运行此命令时

otool -t binary

otool会正确转储binary的文字部分。 E.g。

0000000100002100   55 48 89 e5 41 56 53 48 8b 35 32 24 54 00 4c 8b 
:

但是当我运行这个命令时:

otool -tvV binary

otool跳过了文字部分的大部分内容:

00000001003a32ce pushq %rbp
:

简单地跳过第一个3805646字节而不是反汇编。如果我在lldb中打开二进制文件,我可以在跳过的地址上反汇编代码就好了。

有没有人做过类似的经历? otool是否可能有内部大小限制并截断超出该限制的部分?有没有人发现解决方法或知道可以免费获得的类似工具?

我尝试用lldb反汇编整个二进制文件:

lldb binary
(lldb) dis -s 0x100002100 -e ...

-e设置为文本部分中最后一个字节的地址但不起作用。实际上lldb在反汇编大约5000字节的文本部分后停止输出。

2 个答案:

答案 0 :(得分:1)

我以前见过这个,我相信StringBuilder(恼人地)跳到第一个符号。如果您执行otool,则是nm -n binary上第一个定义的符号吗?

Xcode附带了另一个名为00000001003a32ce的工具,似乎可以反汇编整个文本段。据推测,在重写之前它是otool-classic的旧版本或类似的东西。虽然它获得整个文本段,但它可能在其他方面不太有用(例如解码对选择器或字符串的引用)。要调用它,请使用otool

在我的测试中,您还可以使用早期版本的Xcode附带的xcrun otool-classic <args>版本。来自Xcode 7.3.1和Xcode 6.4的那些没有这个问题。 (这些是我碰巧用来测试的。其他人也可能有用。)

答案 1 :(得分:0)

根据Ken Thomases的回复和评论,我使用旧版Xcode版本的otool进行了一些测试,发现Xcode 7.3.1中的otool效果更好,但也不会拆解整个版本文字部分。我向Apple提交了一份错误报告,结果如下:

  

Engineering已确定此问题的行为符合预期   关于以下信息:

     

otool(1)的实现在Xcode 8中更改为基于   llvm-objdump(1)来自旧的otool-classic(1),它仍然在上面   系统

     

对于llvm社区,启动反汇编的当前行为   从第一个已知的符号是llvm社区的行为   欲望。

事实上,otool-classic按预期工作(xcrun otool-classic会起作用),就像肯在他的评论中已经指出的那样但是我对这个回复不满意所以我现在要提交一个bug在LLVM项目。