2

When I run this command

otool -t binary

otool will correctly dump the text section of binary. E.g.

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

But when I run this command:

otool -tvV binary

otool skips a huge part of the text section:

00000001003a32ce pushq %rbp
:

The first 3805646 bytes are simply skipped and not disassembled. If I open the binary in lldb, I can disassemble code at the skipped addresses just fine.

Has anyone ever made similar experiences? Does otool maybe have an internal size limit and truncates sections beyond that limit? Has anyone discovered a work-around or knows a comparable tool that is available for free?

I tried to disassemble the whole binary with lldb:

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

Setting -e to the address of the last byte in the text section but that doesn't work either. Actually lldb stops output after disassembling about 5000 bytes of the text section.

4

2 回答 2

2

我以前见过这个,我相信otool(令人讨厌)跳到第一个符号。如果这样做nm -n binary,第一个定义的符号是在00000001003a32ce?

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

在我的测试中,您还可以使用otool早期版本的 Xcode 附带的版本。Xcode 7.3.1 和 Xcode 6.4 中的没有这个问题。(这些是我碰巧可以方便测试的。其他可能也可以。)

于 2017-01-20T20:26:47.990 回答
1

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

工程部门已根据以下信息确定此问题的行为符合预期:

otool(1) 的实现在 Xcode 8 中更改为基于旧 otool-classic(1) 中的 llvm-objdump(1),该旧 otool-classic(1) 仍在系统中。

对于 llvm 社区来说,当前从第一个已知符号开始反汇编的行为是 llvm 社区所希望的行为。

事实上,就像肯在他的评论中指出的那样,otool-classic可以按需要工作(xcrun otool-classic将工作),但我对这个回复不满意,所以我现在将在 LLVM 项目中提交一个错误。

于 2017-01-25T09:19:12.257 回答