mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-09-19 19:07:48 +02:00
headless: add --re-module, a static reverse-engineering dump for one PRX
Loads a single module standalone - no game, no boot - and writes a report: module header and segments, the export and import tables with NIDs resolved to names through the HLE tables, one annotated disassembly file per function, and a call graph as JSON. Reuses the emulator's own loader rather than parsing PRXes a second time, so decryption, decompression, relocation and import resolution can't drift from what actually runs. Only enough of the system is brought up to load a module: memory map, timing, HLE tables and the kernel allocators. Nothing executes. Two things beyond a plain disassembly, both aimed at the questions that come up when reading unfamiliar MIPS: - lui/addiu (and lui/load) pairs are folded and reported as the address they form, which is how every global and constant table gets reached. - Per function, a register evidence block instead of a guessed signature. A MIPS function that takes two arguments and passes the second one down often never reads it, so 'never read but live across a call' is reported as forwarded rather than quietly dropped from the signature. SetForceRealModuleLoads() is needed because modules like sceAudiocodec_Driver have no DisableHLEFlags bit and so can't be turned off the normal way - they'd fake-load and there would be nothing to look at. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
committed by
Henrik Rydgård
co-authored by
Claude Opus 5
parent
fb976d4f61
commit
386ff2fc3d
@@ -212,6 +212,10 @@ static const CommandLineParam g_autoParams[] = {
|
||||
{POFF(unpackUpdaterModel), CmdParamType::String, "unpack-updater-model", '\0', "PSP model to unpack for (01g..12g, default any)", CmdLineMode::Headless},
|
||||
{POFF(unpackUpdaterFilter), CmdParamType::String, "unpack-updater-filter", '\0', "Only unpack entries under this path, e.g. flash0:/font/", CmdLineMode::Headless},
|
||||
{POFF(installPkg), CmdParamType::String, "install-pkg", '\0', "Install the game update in a .pkg into DIR and exit", CmdLineMode::Headless},
|
||||
{POFF(reModule), CmdParamType::String, "re-module", '\0', "Load one PRX standalone and write a reverse-engineering report, then exit", CmdLineMode::Headless},
|
||||
{POFF(reOut), CmdParamType::String, "re-out", '\0', "Directory for --re-module output (default: re-out)", CmdLineMode::Headless},
|
||||
{POFF(reFunc), CmdParamType::String, "re-func", '\0', "Only disassemble this function of --re-module, by name or address", CmdLineMode::Headless},
|
||||
{POFF(reSyms), CmdParamType::String, "re-syms", '\0', "Apply a .ppsym file of known names before dumping --re-module", CmdLineMode::Headless},
|
||||
{POFF(odsLog), CmdParamType::Bool, "odslog", 'o', "Also log through OutputDebugString (Windows)", CmdLineMode::Headless},
|
||||
{POFF(generateInterpreterDispatch), CmdParamType::Bool, "generate-interpreter-dispatch", '\0', "Generate C++ interpreter dispatch code (ExecInstruction) to stdout and exit", CmdLineMode::Headless},
|
||||
{POFF(resolutionScale), CmdParamType::Int, "resolution-scale", '\0', "Set the resolution scale factor"},
|
||||
|
||||
Reference in New Issue
Block a user