代码之家  ›  专栏  ›  技术社区  ›  Mecki

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

  •  2
  • Mecki  · 技术社区  · 8 年前

    当我运行这个命令时

    otool -t binary
    

    otool 将正确转储的文本部分 binary 例如。

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

    但当我运行此命令时:

    otool -tvV binary
    

    耳油 跳过文本部分的很大一部分:

    00000001003a32ce pushq %rbp
    :
    

    仅跳过前3805646个字节,而不进行分解。如果我打开二进制文件 lldb ,我可以在跳过的地址处反汇编代码。

    有没有人有过类似的经历?做 耳油 可能有一个内部大小限制并截断超出该限制的部分?是否有人发现了一种变通方法或知道一种可供免费使用的类似工具?

    我试着用 lldb :

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

    背景 -e 到文本部分中最后一个字节的地址,但这也不起作用。事实上 lldb 在分解大约5000字节的文本部分后停止输出。

    2 回复  |  直到 8 年前
        1
  •  2
  •   Ken Thomases    8 年前

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

    Xcode附带了另一个工具,称为 otool-classic ,这似乎分解了整个文本段。大概是旧版本的 耳油 在重写或类似的事情之前。虽然它获得了整个文本段,但它在其他方面(如对选择器或字符串的引用进行解码)可能不那么出色。要调用它,可以使用 xcrun otool-classic <args> .

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

        2
  •  1
  •   Mecki    8 年前

    根据Ken Thomases的回复和评论,我用 otool 从旧的Xcode版本中发现 耳油 在Xcode 7.3.1中工作得更好,但也不会分解整个文本部分。我向苹果提交了一份错误报告,结果如下:

    工程部已确定该问题的行为符合预期 关于以下信息:

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

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

    事实上, otool-classic 按需工作( xcrun otool-classic 将工作),就像Ken在他的评论中已经指出的那样,但我对这个回复不满意,因此我现在将在LLVM项目中提交一个bug。