fold/third_party/ghidra-decompiler/VENDOR.md

52 lines
2.8 KiB
Markdown

# Vendored: Ghidra decompiler (SLEIGH + decompiler core)
Upstream: https://github.com/NationalSecurityAgency/ghidra
- Tag: `Ghidra_12.1_build` (Ghidra 12.1, released 2026-05-13)
- Pinned commit: `7e89d94e3478f0b1931c34882a0f606fdb06961f`
- License: Apache-2.0 (see `LICENSE`).
## What is vendored
- `cpp/` — verbatim copy of `Ghidra/Features/Decompiler/src/decompile/cpp/` at the pinned
commit. We compile the **`libdecomp`** subset (full SSA decompiler): the `CORE`, `DECCORE`,
and `SLEIGH` object sets from the upstream `Makefile`. Unneeded files in the dir (e.g.
`bfd_arch.cc`, `analyzesigs.cc`, `ghidra_process.cc`, `consolemain.cc`, `*_test*.cc`,
`rulecompile.cc`) are left in place but not compiled by fold's build.
- `specs/AARCH64/` — verbatim copy of `Ghidra/Processors/AARCH64/data/languages/` (the
`.slaspec`/`.sinc`/`.ldefs`/`.pspec`/`.cspec` sources).
- `specs/x86/` — verbatim copy of `Ghidra/Processors/x86/data/languages/` (the `old/`
legacy subdir is dropped). Provides `x86:LE:64:default` (x86-64) and `x86:LE:32:default`
(32-bit). Additional arches (ARM, MIPS) are added under `specs/<arch>/` the same way.
## No bison/flex needed
All generated parser/lexer outputs required by the `libdecomp` set are committed upstream and
copied here: `slghparse.cc`/`.hh`, `slghscan.cc`, `xml.cc`, `pcodeparse.cc`, `grammar.cc`.
`ruleparse.cc` is NOT committed, but it is only used by `rulecompile.cc`, which is **not** part
of the decompiler library — so fold's build needs neither bison nor flex.
## .sla policy (checked-in runtime copies + build validation)
Fold keeps checked-in `.sla` files next to each vendored language spec under
`specs/<arch>/`. Runtime lookup intentionally points `FOLD_GHIDRA_SPECS_DIR` at
that source-tree spec directory because the Ghidra loader needs the compiled
`.sla` together with sibling `.ldefs` / `.pspec` / `.cspec` files.
Meson also builds `ghidra_sleigh` and regenerates `.sla` files into the build
tree as a validation target. Those generated build-tree copies prove the pinned
`.slaspec` sources still compile, but they are not the dev-build runtime lookup
location until an install/datadir rule copies the full spec directory. If this
policy changes, update both this file and the `FOLD_GHIDRA_SPECS_DIR` definition
in the top-level `meson.build` in the same commit.
## External docs
- P-Code reference: https://ghidra.re/ghidra_docs/languages/html/pcoderef.html
- SLEIGH language manual: https://ghidra.re/ghidra_docs/languages/html/sleigh.html
## Updating
Re-run a sparse blobless checkout at the new tag, copy `cpp/` and `specs/<arch>/`, update the
pin above, and re-run fold's build. The embedding API surface used by fold is in
`src/binary/ghidra_lifter.cpp` (LoadImage / SleighArchitecture / Funcdata). See
`docs/internal/ghidra-pcode-integration-research.md`.