rea/docs/ghidra-ppc.md

4.4 KiB

PowerPC ELF analysis through Ghidra

This lane extends native ELF analysis to 32-bit big-endian PowerPC; it does not execute PowerPC code. It is the first milestone of #1741. GameCube/Wii DOL executables, PPC64 and other PowerPC variants are separate follow-ups.

Admission boundary

ELF EM_PPC (20) is retained as the provider-neutral powerpc family. The target also retains class, byte order, e_type and raw e_flags. Recognition does not mean every provider or PowerPC variant is supported. EM_PPC64 (21) is not recognized as this family.

The Ghidra lane admits ELF32 ET_EXEC, big endian. ELF64, little-endian, relocatable and shared objects are refused with a specific unsupported constraint. EF_PPC_EMB declares an embedded variant and is refused; the remaining e_flags bits only declare relocation conventions and do not change instruction decoding.

Bound language

Ghidra's ELF loader selects PowerPC:BE:32:e500:default for a plain EM_PPC header with e_flags 0. e500 is the embedded Book-E variant whose SPE unit replaces the classic floating-point unit, so it misinterprets ordinary 750-family code. Nothing in the header distinguishes the two.

The lane therefore imports with PowerPC:BE:32:default and compiler spec default, commits that choice in the analysis profile as language_selection: "provider-pinned-v1", and checks the language Ghidra reports after import. A different language set through REA_GHIDRA_LANGUAGE_ID (and optionally REA_GHIDRA_COMPILER_SPEC_ID) replaces the lane default and is admitted against the installed language catalog as usual; for example PowerPC:BE:32:e500 for genuine e500 code.

PowerPC header facts are committed in the analysis profile so interpretation changes invalidate profile-bound snapshots. The support-lane identity is versioned independently of file identity. Evidence, lifecycle outputs and saved snapshots preserve the powerpc family. Hopper and IDA adapters do not implicitly gain PowerPC support. Windows Ghidra P0 remains PE x86/x86-64 only.

Use

With a caller-installed Ghidra and compatible JDK on a supported Linux/macOS host:

rea analyze /absolute/path/to/ppc.elf --provider ghidra --json
rea function /absolute/path/to/ppc.elf function_name --provider ghidra --json

MCP uses the existing tools, including open_binary with an absolute path and provider_id: "ghidra". No PowerPC-specific tool catalog or emulator is introduced.

Verification

The source-owned freestanding fixture is tests/conformance/c/ppc.c. The optional cross-target lane requires a caller-supplied Clang with the PowerPC target, LLD, GNU readelf, Ghidra and its compatible JDK; ordinary host-native checks do not acquire these tools. REA_PPC_CLANG selects Clang and REA_PPC_READELF selects GNU readelf (for example /opt/homebrew/opt/binutils/bin/readelf on macOS). These are test-time prerequisites, not REA runtime providers.

GHIDRA_INSTALL_DIR=/absolute/path/to/ghidra npm run verify:ghidra:ppc

The lane compiles the fixture for a 750-family core (-mcpu=750) and never executes it. GNU readelf independently supplies header facts and symbol addresses, compared with the production REA target resolver before provider startup. Its version, bounded command output and selected tool path are retained in the verification report. The parser deliberately recognizes only this fixture's GNU output, rejecting missing, ambiguous or unexpected fields rather than substituting defaults.

Existing public MCP operations check Ghidra's observed language and compiler specification and loaded-file hashes; an e500 import fails the lane. The source-owned ppc-probe.S supplies fixed addi and conditional-branch encodings: verification checks bytes, length, immediate and direct destination, independent of decompiler variable names. Global and string bytes are checked at independently reported symbol addresses.

CLI/MCP discovery and decompilation, direct calls, target/profile/Evidence identity, snapshot round-trip and final process cleanup remain covered. Pseudocode presence is a liveness check, not proof of semantic equivalence. Instruction decoding and reader agreement do not establish runtime or complete floating-point semantics. Parser/profile tests are narrower checks, not substitutes for this real-provider run. Report the actual lanes run and leave unexecuted verification pending.