如何按地址反汇编SBCL函数及确定函数字节长度?
在SBCL中确定目标函数字节长度的方法
针对你遇到的问题,这里有几种可行的方式来获取目标地址对应函数的字节长度,或者绕开手动指定长度的需求:
通过代码对象直接获取长度
SBCL中每个编译后的Lisp函数都对应一个code object,你可以先通过目标地址找到对应的代码对象,再直接获取其长度:;; 找到地址对应的代码对象 (setf *code-obj* (sb-kernel:find-code-object #x52A00B30)) ;; 获取代码对象的字节长度 (sb-disassem:code-object-length *code-obj*)拿到长度后,就可以准确调用反汇编内存的函数:
(sb-disassem:disassemble-memory #x52A00B30 (sb-disassem:code-object-length *code-obj*))直接反汇编整个代码对象(更简便)
不需要手动计算长度,直接对找到的代码对象执行反汇编,会自动覆盖整个函数的代码:(sb-disassem:disassemble-code-component (sb-kernel:find-code-object #x52A00B30))动态调整反汇编长度(备选方案)
如果无法通过代码对象获取信息(比如目标是C编译的外部函数),可以先指定一个较大的初始长度(比如200)执行反汇编,观察输出的汇编指令,找到函数的返回指令(如x86架构的ret、ARM的bx lr),以此确定函数的实际结束位置,再调整长度重新反汇编。
内容的提问来源于stack exchange,提问作者Zwanzika Hatzel
相关产品推荐
相关产品推荐

