Kotosif
Kotosif

Reputation: 355

LLDB Python scripting - how to add module or load symbol file at particular address?

In LLDB you can do the following during a debugging session to add missing symbols at particular addresses:

target modules load --file <symbol file> .text 0x<address>

How can you do that in with the LLDB Python scripting module? I searched through the API but I couldn't find a corresponding method.

Upvotes: 0

Views: 53

Answers (2)

Jim Ingham
Jim Ingham

Reputation: 27110

The SBTarget manages the list of modules. So you would add a module to the target (but not give it load addresses) using SBTarget::AddModule. Then to give load addresses to the module, you can either use SBTarget::SetModuleLoadAddress - if the whole module loads rigidly like on Darwin, or go through the sections of the module using SBTarget::SetSectionLoadAddress if the sections load at different offsets as happens on ELF systems.

You might take a look at the symbolication.py module - particularly add_module and load_module. It's a pretty fully worked out version of how to recreate the symbol world of a binary from a list of modules and load addresses, then looking up addresses in that context. That's at:

https://github.com/llvm/llvm-project/blob/main/lldb/examples/python/symbolication.py

Upvotes: 0

Kotosif
Kotosif

Reputation: 355

I figured it out. You can make use of the debugger.HandleCommand to run arbitrary LLDB command. The general way I resolved this was to define and register a function that can be called during a LLDB debugging session.

For example:

def load_libraries(debugger, command, result, internal_dict):
    print(f"image add some_library.so", flush=True)
    debugger.HandleCommand(f"image add some_library.so")
    print(f"target modules load --file some_library.so .text 0x<some address>", flush=True)
    debugger.HandleCommand(f"target modules load --file some_library.so .text 0x<some address>")

Upvotes: 0

Related Questions