当我运行此命令时
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字节的文本部分后停止输出。
答案 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项目。