rea/docs
Aurelio Bernal 290d301ec7
feat(ghidra): admit relocatable MIPS32r2 ELF objects (#1950)
* feat(ghidra): admit soft-float MIPS32r2 ELF with integer-register float storage

Soft-float o32 executables (Linux kernel builds, bare-metal firmware) were
refused because their ABI flags record declares no CPR1 and FP ABI 3.
Ghidra's MIPS32 compiler specifications model only hard-float o32, so typed
float/double signatures (DWARF) would be bound to $f12/$f14/$f0 and the
decompiler loses the real dataflow: `return sel ? a : b` decompiled to
`return in_f0;`, and callers passed phantom FPU inputs.

Admit ELF32 ET_EXEC o32 MIPS32r2 targets whose ABI record declares soft-float
with no CPR1, and commit `mips_soft_float_storage: o32-integer-registers-v1`
in their analysis profile only (hard-float profile digests are unchanged).
ReaGhidraMipsSoftFloat.java runs after auto-analysis and, for each function
with a float/double formal type, either keeps the types with the storage
Ghidra's o32 model assigns to a same-size integer (pair alignment, stack
spill), or, for auto-parameters such as hidden struct-return pointers, swaps
float types for same-size integers under dynamic storage. No function is left
on hard-float storage. The report is written last; the provider client
requires it exactly when the profile commits the policy and refuses the
session before any operation otherwise.

Verification: real Ghidra 12.1.4 lane (verify:ghidra:mips) now builds
hard- and soft-float fixtures in both byte orders and checks exact
parameter/return storage through inspect_native_api, caller constants,
snapshot profile and Evidence outcome; test:fast, verify:package and an
installed-tarball soft-float run pass.

* fix(ghidra): model soft-float MIPS as a prototype for every typed callable

Review feedback on #1949: rewriting storage per Function left external
functions and indirect calls through typed function pointers on Ghidra's
hard-float o32 prototype, which still read $f12/$f14/$f0 while the session
reported success. A negative control confirms it: without the change,
`(*rea_mips_soft_callback)(8.5f, 9.5f, sel)` decompiles to
`(*rea_mips_soft_callback)(in_f12, in_f14, sel)`.

ReaGhidraMipsSoftFloat.java now derives a `__rea_soft_float` prototype from
the program's own default o32 model (encoded, float pentries and
float-consuming rules removed, so byte-order-specific aggregate rules and the
hidden struct-return pointer are kept), installs it as a specification
extension, and assigns it with dynamic storage to every non-thunk function,
external function and function-pointer definition whose formal types use
float or double. Thunks follow their targets. Float types are kept
everywhere, so the integer-retype fallback is removed. The script fails
without writing its report if the derived prototype or any reassigned
function still uses an FPU register.

The policy becomes `o32-soft-float-prototype-v1` with a
{functions, definitions} report. The soft-float fixture adds an indirect
call through a typed pointer; the real-Ghidra lane requires its constants
with no FPU inputs and the struct return's `float scale` in $a1.

* test(ghidra): pin ODDSPREG acceptance for soft-float MIPS ABI records

Review on #1949 suggested requiring flags1 == 0 for soft-float, since MIPS_AFL_FLAGS1_ODDSPREG names CPR1 registers. GCC 5.2 kernel modules, LLVM/Rust firmware and Clang -msoft-float objects all record flags1 = 1 with FP ABI soft-float: it is the MIPS32 o32 toolchain default and selects nothing without CPR1. Keep accepting it, say why at the check, and test that soft-float with ODDSPREG is admitted while any other general flag is refused.

* feat(ghidra): admit relocatable MIPS32r2 ELF objects

Linux MIPS kernel modules (.ko) and other ELF32 o32 MIPS32r2 ET_REL objects
were refused by the Ghidra MIPS lane. Ghidra's ELF loader already places each
allocated section and applies REL relocations; this admits ET_REL alongside
ET_EXEC (ET_DYN and PRX stay refused) under its own support lane,
`elf32-rel-o32-arch32r2-standard-v1`, so executable targets keep theirs.
Relocatable sessions carry limitations: addresses are analysis coordinates,
undefined symbols live in Ghidra's EXTERNAL block, and HI16 relocations report
PARTIAL because Ghidra applies them with their paired LO16.

Verification: new `verify:ghidra:mips-relocatable` real-Ghidra lane builds
-c -G0 objects in both byte orders plus a soft-float -mlong-calls module
variant. GNU readelf supplies sections, symbols and REL entries; every
relocation in an allocated section must encode S + A in the loaded word
(S from Ghidra placement, A from original bytes), with HI16/LO16 checked as
the effective address each LO16 forms, and coverage of a shared HI16, a LO16
carry, external code/data and R_MIPS_32 is asserted. The executable lane,
unit suites pass, and on 30 real .ko files 54,972 relocations matched (93 reference empty sections and are not checkable).

* fix(ghidra): verify every MIPS HI16 and archive-typed soft-float externals

Review feedback on #1950:

- The relocation oracle kept one pending HI16, so a second HI16 before the
  LO16 that resolves both overwrote the first, and unrelated relocations
  cleared it; the earlier site's high half and carry were never compared
  with S + A. Every HI16 now waits for the next LO16 of its symbol, which
  checks all of them; later LO16s reuse those HI16s, and a HI16 left
  unresolved at a section end fails. On 30 real soft-float kernel modules,
  24 contain several HI16s per LO16; all 54,972 placed relocations match.
- External callees with float prototypes: the relocatable fixture now calls
  powf, whose prototype Ghidra's C library archive applies by name. Every
  variant must decompile `powf(1.5,2.5)` without FPU inputs, and the
  soft-float module variant must report that __rea_soft_float covered it
  (with the external step removed it decompiles as `powf(param_1,param_2)`).
  `-fno-builtin` keeps the call from being folded.

Also updates the module variant's expected soft-float policy to
`o32-soft-float-prototype-v1`.

---------

Co-authored-by: morluto <76467478+morluto@users.noreply.github.com>
2026-10-12 05:02:55 +08:00
..
.vitepress feat(native): admit raw binaries with caller-supplied architecture and entry (#1868) 2026-10-12 00:06:29 +08:00
assets docs: keep license sections text-only 2026-10-10 00:09:46 +08:00
releases chore(main): release rea-agents 6.4.0 (#1399) 2026-10-11 11:57:29 +08:00
adb-device-analysis.md fix(adb): retain rollback ownership and cancelled acquisition facts 2026-10-11 00:28:39 +08:00
android-analysis.md fix(android): preserve executable static initializer evidence (#1876) 2026-10-11 23:40:42 +08:00
apktool-resource-analysis.md fix(apktool): run Windows batch launchers through cmd.exe (#1777) 2026-10-11 17:16:48 +08:00
apple-application-analysis.md fix(mobile): bound framework conventions to path segments (#1506) 2026-10-10 21:42:03 +08:00
architecture.mermaid refactor: use canonical implementations and types directly 2026-10-09 23:35:19 +08:00
binary-diagnostics.md fix(native): raise default PE resource entry budget to 16384 (#1703) 2026-10-11 19:01:33 +08:00
browser-observation.md fix(browser): retain effective source-map response urls 2026-10-11 15:35:43 +08:00
browser-scenario-contract.md fix(browser): seed storage by browser partition 2026-10-11 10:17:53 +08:00
cli.md feat(native): admit raw binaries with caller-supplied architecture and entry (#1868) 2026-10-12 00:06:29 +08:00
electron-observation.md fix(electron): support packaged app.asar pages and rewritten unpacked companions (#1400) 2026-10-10 23:01:54 +08:00
error-contract.schema.json feat(evm): inspect offline bytecode interfaces through EVMole (#1051) 2026-10-08 15:32:05 +08:00
evm-bytecode.md fix(build): make catalogs and packaged skills generated outputs (#1086) 2026-10-08 22:43:51 +08:00
firmware-analysis.md fix(providers): retain worker cleanup owners through shutdown 2026-10-11 00:03:21 +08:00
ghidra-dos.md fix(ghidra): reject address truncation before reads and edits 2026-10-09 03:53:28 +08:00
ghidra-mips.md feat(ghidra): admit relocatable MIPS32r2 ELF objects (#1950) 2026-10-12 05:02:55 +08:00
ghidra-nativeaot.md feat(ghidra): inspect NativeAOT PE metadata read-only 2026-10-11 10:31:49 +08:00
ghidra-provider.md feat(ghidra): inspect NativeAOT PE metadata read-only 2026-10-11 10:31:49 +08:00
ghidra-psp.md feat(ghidra): admit bounded PSP ELF through installed Allegrex (#1599) 2026-10-11 19:47:33 +08:00
harmony-analysis.md feat(harmony): project HarmonyOS package inventory evidence (#1447) 2026-10-11 20:09:21 +08:00
ida-provider.md fix(ida): preserve non-x86 call edges and workflow uncertainty (#1906) 2026-10-12 04:10:22 +08:00
index.md docs: publish VitePress documentation on GitHub Pages 2026-10-07 16:58:04 +08:00
installation.md feat(ghidra): apply validated analyzer overrides before analysis 2026-10-12 03:49:31 +08:00
javascript-application-graph.md docs(contracts)!: explain canonical URL and skill metadata ownership 2026-10-10 02:49:46 +08:00
javascript-application-workflows.md docs: correct stale logging, Ghidra host, and example path statements (#1420) 2026-10-10 21:29:31 +08:00
javascript-artifact-reconstruction.md fix(javascript): preserve package and source-map boundary identity (#1939) 2026-10-12 04:09:17 +08:00
javascript-recovery.md feat(javascript): recover code-split bundles from multiple inputs (#1686) 2026-10-11 18:39:49 +08:00
javascript-runtime-observation.md fix(inspector): bound retained metadata and preserve cancellation 2026-10-09 05:15:23 +08:00
javascript-runtime-reconciliation.md fix(tools)!: simplify direct invocation and harden boundary contracts (#555) 2026-10-05 20:16:44 +08:00
jeb-analysis.md feat(jeb): add JEB engine provider over its MCP interface (#1536) 2026-10-10 23:03:27 +08:00
managed-code-analysis.md fix(managed): honor metadata ExtraData before table decoding (#1893) 2026-10-12 02:28:22 +08:00
mcp-contracts.md fix(mcp): provide native evidence paging continuation 2026-10-12 04:26:05 +08:00
mcp-prompts.md feat(mcp): select views of retained analysis results (#1180) 2026-10-09 12:45:48 +08:00
migration-6.2.md docs: correct MCP error and capture import guidance 2026-10-10 05:41:52 +08:00
native-investigation.md feat(native): expose typed incoming references at exact addresses (#1715) 2026-10-11 19:52:09 +08:00
process-capture.md feat(process): bound a finalization interval before forced capture timeout 2026-10-11 09:55:43 +08:00
raw-binary.md feat(ghidra): apply validated analyzer overrides before analysis 2026-10-12 03:49:31 +08:00
reconstruction-obligation-ledgers.md refactor: return complete analysis results inline 2026-09-29 08:07:24 +08:00
reconstruction-readiness.md fix(tools)!: simplify direct invocation and harden boundary contracts (#555) 2026-10-05 20:16:44 +08:00
recorded-crashes.md feat(native): inspect recorded crashes through pwntools and pwndbg (#1054) 2026-10-08 16:50:31 +08:00
releasing.md fix(release): avoid duplicated contributor thanks 2026-10-11 11:49:49 +08:00
roadmap.md docs: remove retired architecture and migration artifacts 2026-10-10 05:41:45 +08:00
testing.md feat(ghidra): apply validated analyzer overrides before analysis 2026-10-12 03:49:31 +08:00
tool-design.md docs: prune repeated contributor and tool design instructions 2026-10-10 05:28:13 +08:00
user-visible-errors.csv fix(errors): stop recommending retries for non-retryable failures (#1869) 2026-10-11 23:17:35 +08:00
wasm-artifacts.md feat(wasm): inspect local artifacts with WABT (#1533) 2026-10-11 19:49:00 +08:00
web-network-captures.md fix(bun): report the real runtime and enforce worker memory budgets on Windows (#1730) 2026-10-11 19:20:00 +08:00
web-runtime.md fix(browser): treat module-import initiator positions as script positions 2026-10-08 16:44:25 +00:00
web-source-location.md fix(bun): report the real runtime and enforce worker memory budgets on Windows (#1730) 2026-10-11 19:20:00 +08:00
website-module-trace.md feat(browser): trace captured website module imports (#879) 2026-10-07 14:59:52 +08:00
website-script-export.md fix(files): reject nonregular capture and JSON inputs 2026-10-10 01:49:54 +08:00
windows-ghidra-p0.md feat(ghidra): inspect NativeAOT PE metadata read-only 2026-10-11 10:31:49 +08:00