【发布时间】:2020-02-20 02:14:33
【问题描述】:
说,我在 Mach-O 可执行文件中有两个相邻的函数 subfunc() 和 main(),想反汇编从 subfunc() 到 main()+0x10. 的所有指令
我知道我可以使用 `(void(*)())subfunc` 将函数转换为地址 - 没有更简单的方法吗?
我的尝试如下,但我收到以下错误消息:
dis -s `(void(*)())subfunc` -e `(void(*)())main+0x10`
error: error: arithmetic on a pointer to the function type 'void ()'
我该如何解决这个问题?
【问题讨论】:
-
如果你有调试信息,所以 lldb 知道这些是函数,有一种特殊情况,你不使用反引号,它会做正确的事情 --
dis -s subfunc -e main+16-- 但我只是检查过,当 lldb 现在不知道这些是函数符号时,它看起来不起作用。显然,没有任何有效的 C 表达式可以为函数名称添加偏移量,因此 lldb 中有一些额外的技巧来允许这个(通常有用的)地址表达式。我不记得为什么它使用带有地址表达式而不是反引号的参数 eval r.n. -
@JasonMolenda - 谢谢。地址表达式和反引号 eval 不是一回事吗?你能指点我这些东西的文档吗?
-
main+5 不是一个有效的 C 表达式,但它是一种非常方便的指定地址的方法。我们没有修改表达式解析器以接受这种形式(我们希望使表达式解析器与源语言保持准确),而是添加了“地址表达式”。他们首先尝试将他们的参数评估为表达式,如果失败,他们将解析形式为“symbolname+-offset”的简单表达式,“帮助地址表达式”是应该记录的地方,但是帮助字符串有点简洁。 ..
-
@JimIngham,在任何地方都没有关于地址表达式或反引号表达式的详细文档吗?如果
<symbol>+-<offset>有效,为什么main+5无效?main不是符号吗?