首页 > 解决方案 > LLDB Python API,如何找到模块的加载地址?

问题描述

我正在尝试为 lldb 编写一个 Python 插件,它将根据给定的模块名称和从该模块开始的偏移量创建一个断点。目前我正在手动执行此操作,使用以下命令:

(lldb) image list my_module
[  0] XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX 0x00000000deadbeef /path/to/my_module
(lldb) breakpoint set -a 0x00000000deadbeef + 0x1234

我想自动化这个。为此,我需要获取my_module. 类似于使用 lldb 的image list命令并读取结果地址。

我找到了SBModule.ResolveFileAddress()进行反向转换的方法 - 它采用绝对地址并将其转换为相对于模块的地址。

是否有一个函数接受一个SBModule对象或一个模块名称,并返回该模块的负载?

标签: pythondebugginglldb

解决方案


模块本身并没有真正的加载地址。在许多系统上,模块的不同部分可以独立重定位,因此每个部分可以有不同的加载地址。这甚至可能发生在 mach-o 上的共享缓存中,尽管通常 mach-o 将二进制文件作为一个单元加载。

“图像列表”显示二进制文本部分的加载地址。如果您知道要查找的符号在 TEXT 部分中,那么您可以从 SBModule 中获取 SBSections(它具有可迭代的“sections”属性)找到 TEXT 部分并获取其加载地址。


推荐阅读