Features
- All mappers now share a single disassembler
--backendvalue (ida/ghidra) implemented in one common place, replacing the previous per-mapper disassembler/exporter selection. - Remove the
qbinary/Quokka dependency:fs-cganddecompnow interact directly with the disassemblers (IDA, Ghidra), so Pyrrha can run on systems without Quokka. - Add ELF SONAME support: binaries are indexed by their
DT_SONAMEso imports referencing a SONAME resolve even without a matching symlink. decompmapper: full rework around a class-based object integrated with the common backend layer.decompmapper: add a-e/--exportoption to dump the result as JSON, loadable through the newExportedDecompilationobject exposed by Pyrrha.- Expose
Binaryimage base and relocatable information on the internal representation. cli: revamp the console output rendering.- Improve the documentation (installation, quick summary, decomp mapper) and migrate the documentation build from MkDocs to Zensical.
- Add unit tests for the
decompexport model plus functional tests for thedecompmapper.
Fixes
intercgmapper: various fixes around addresses and demangled names, missing Ghidra thunks, extended ignore list, and argument renaming.fs-cgmapper: avoid an infinite loop in trampoline resolution and add a real timeout to program loading.fs/fs-cgmappers: passload_binaryarguments through apartialmechanism and improve multiprocessing error handling.decompmapper: fix the mapping run (mapnow reports success/failure, runs the decompilation and call-graph indexing phases, and records the binary node so functions get a valid parent).decompmapper: fix call-graph source cross-references (call-site locations are looked up by callee address and no longer raise on the first reference).decompmapper: fix command-line arguments and improve the decompilation script (correctNamedTemporaryFileusage, better IDA decompilation output).decompmapper (IDA backend): use theida_domain0.5.0 pseudocode API (get_pseudocode(func).to_text(...)), fixing aTypeErrorthat broke every IDA decompilation run.decompmapper: skip imported functions during source and call-graph indexing (they have no decompiled body), removing spurious per-function error/warning logs.decompmapper: write decompiled source via a portable temporary file, fixing aTypeError(delete_on_close) that aborted every run on Python 3.11.decompmapper: attach call-site locations to the call reference returned byrecord_ref_callinstead of the callee symbol id.decompmapper: record each function's source file under a per-function unique name, fixing aUNIQUE constraint failed: file.idcrash when two functions share a name.decompmapper (IDA backend): fix the function type reported by IDA.decompmapper: fix small remaining issues in database handling.importsmapper: fix duplicate-import resolution not honoring theINTERACTIVEcache on a cache hit, which could leave the resolution prompt loop stuck.cli: keep an existing suffix in the DB path and annotate thedecompmapper variable with its base type to fix a type-checking error.
Internal
- Reorganize the repository into two submodules (
backendandmappers) and rework the mappers so backend support lives in a single common place; remove unused modules and theheimdallr/disassembly-sync prototype. - CI: build and test IDA and Ghidra Docker images, run the
decompexport-model and functional tests, export test artifacts, and trigger builds only on relevant changes. - CI: expand the supported Python version range.
- Add backend-free unit tests for the
decomp,importsandintercgmappers and the CLI, raising coverage without needing a disassembler; run them in CI and merge their coverage into the global report. - Tests: make export-artifact collection best-effort so a read-only pre-existing destination (e.g. artifacts downloaded from another job) no longer fails the test at teardown.
- CI: run coverage in parallel mode, add a
coveragejob that combines the data files from every test job into a single global coverage report (the union of all lines exercised by the whole suite), preserve each job's coverage data ahead of that combine step so nothing is lost, and refine the coverage targets.
Full Changelog: v1.0.1...v2.0.0