mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 06:45:22 +00:00
[GH-ISSUE #1193] [Feature] Analyze a caller-selected matching dSYM with the Ghidra provider #427
Open
opened 2026-10-15 18:24:58 +00:00 by bsakaguchi
·
2 comments
No Branch/Tag specified
main
codex/procedure-reference-stacked
release-please--branches--main--components--rea-agents
release-please--branches--main--components--rea-agents--release-notes
codex/kuna-independent-retry
codex/byte-search-overlay-coverage
codex/open-failure-target-receipt
codex/kuna-xref-evidence
codex/ghidra-ambiguous-procedure-recovery
codex/function-source-bundle
codex/trace-function-integration-prototype
codex/snapshot-source-closure
codex/recorded-evidence-array-pages
codex/evidence-recovery-redesign
codex/trace-feature-address-scope
codex/call-discovery-scope
codex/ghidra-literal-candidate-evidence
codex/decompile-directory-independent-retry
codex/retry-provenance-base
codex/value-flow-capability-experiment
codex/ghidra-containing-instruction
cursor/readme-discord-button-ef9f
dependabot/github_actions/actions/setup-node-7.1.0
dependabot/github_actions/actions/upload-artifact-7.0.2
dependabot/npm_and_yarn/npm-minor-and-patch-d8d97ce6df
codex/kuna-1989
fix/8559-native-ui-fixture-ownership
fix/8555-go-verifier-mcp-ownership
codex/provider-capability-recovery
fix/8642-rizin-target-stdin
codex/ghidra-memory-effect-scope
codex/ghidra-annotation-entry-selector
codex/ghidra-readonly-recovery
codex/ghidra-regex-verifier-recovery
codex/evidence-discovery-view-guidance
fix/8545-bulk-append-overflow
fix/8428-navigation-refusal-alternatives
codex/address-context-recovery
codex/matching-member-limitations
codex/unknown-scope-contract
codex/evidence-view-guidance
feat/8373-native-trace-views
codex/ghidra-snapshot-verifier-binding
codex/elf-export-visibility
codex/evidence-view-recovery
codex/native-reference-cli-help
codex/provider-candidate-observation-scope
codex/kuna-session-verification
codex/ghidra-switch-lifetime-guidance
codex/pseudocode-paging-discovery
codex/clarify-evidence-view-support
codex/kuna-xrefs-selector-recovery
codex/context-capacity-recovery
codex/evidence-closure-large-links
codex/same-function-evidence-identity
codex/ghidra-verifier-inspected-jdk
codex/audit-guided-workflows
codex/crash-prompt-retained-dossiers
codex/analysis-view-error-recovery
codex/kuna-verifier-target-selection
codex/ghidra-selected-project-call-coverage
codex/docs-native-analysis-scope
codex/ghidra-java-socket-boundary
codex/ghidra-retained-snapshot-verifier
codex/ghidra-search-inventory-facts
fix/8284-zero-argument-parameter-bindings
fix/8198-ui-action-handler-offset
fix/8257-elf-entry-label-identity
fix/8304-deferred-output-schema-projection
fix/8277-call-path-computed-target-uncertainty
fix/pr-8089-conflicts
fix/ci-static-duplicate-export
dependabot/npm_and_yarn/lint-staged-17.6.0
dependabot/github_actions/actions/download-artifact-8.0.2
dependabot/npm_and_yarn/write-file-atomic-8.0.0
dependabot/npm_and_yarn/canonicalize-5.1.0
dependabot/github_actions/actions/cache/restore-6.1.0
dependabot/npm_and_yarn/toon-format/toon-4.4.0
dependabot/github_actions/actions/deploy-pages-5.0.1
codex/review-fixes-pr-2403
codex/review-fixes-pr-2400
codex/process-terminal-width
codex/test-brittleness-cleanup
verify/7167-browser-connect-macos
fix/7167-browser-connect
feat/native-matching-allowance-setting
feat/browser-scenario-dry-run
test/managed-caller-parameters-20261024
codex/parser-fortythird-boundaries
fix/6926-pinvoke-platform-decorations-20261023
fix/6889-har-body-encoding-20261023
fix/6888-sqlite-schema-budget-20261023
fix/dependency-security-gates-6708
cursor/evidence-overwrite-rebase-b4ac
feat/4057-verify-native-exports
fix/windows-acl-observer-overhead-20261022
cursor/erlang-beam-restack-4476
cursor/pe-certificate-review-bf32
fix/6116-javascript-application-fs-errors
fix/6061-unmapped-runtime-script-unknown
feat/browser-scenario-summary
fix/pe-certificates
codex/verify-3407
cursor/rebase-5699
cursor/rebase-5352
cursor/rebase-5600
cursor/fix-cli-schema-omission-10a8
codex/audit-hopper-shutdown-reasons-20261021
fix/demangle-swift-omitted-record
fix/nib-boolean-value-types
cursor/cancellation-partial-observation-a5ac
fix/ib-object-limit-reasons
fix/electron-fuse-limit-advice
fix/kuna-doctor-dangling-cache
fix/fixed-budget-refusal-advice
fix/js-ipc-listener-dedup
fix/js-return-member-provenance
fix/dmg-integrity-retry-advice
fix/ida-doctor-readiness
fix/kuna-version-probe-output-drain
fix/legacy-swift-runtime-name-matching
fix/dylib-lazy-load-commands
fix/browser-scenario-startup-cancel
fix/swift-nested-punycode-classification
fix/compare-unselected-scopes
fix/objc-method-budget-coverage
fix/dmg-mounted-root-observations
audit/ci-tests-20261019-round2
release/6.7.0
fix/wabt-cleanup-retry-resolution
fix/electron-fuse-elf-pe-architecture
fix/native-plist-descriptor-ownership
fix/kuna-caller-cleanup-ownership
experiment/atomic-codemode-20261016
review/first-contributor-3776
fix/call-resolution-full-read-cycles
fix/member-mutation-selection-repeat
experiment/atomic-re-tools-20261015
perf/member-mutation-lazy-origins
perf/static-network-mutation-index
fix/hopper-startup-lifecycle
audit/3050-windows-proof-20261015
feat/windows-window-capture-2183
audit/3049-windows-proof-20261015
audit/3735-macos-fixtures-20261015
fix/batch-decompile-null-pseudocode
fix/kuna-inventory-honors-jobs
experiment/browser-codemode-tool-design-20261015
fix/hopper-clean-runtime-argv
codex/review-2049-27f1b367
review-fixes/pr-2787-routing
fix/3360-scoped-this-emitters
fix/3367-replaced-global-effects
fix/3838-compact-any-value-items
test/hopper-download-probe-20261015
codex/windows-runtime-creation-red-green-20261015
codex/windows-readonly-root-red-green-20261015
codex/windows-root-share-red-green-20261015
codex/exp-1685-win-mcp-startup
codex/bug-sweep-20261015
investigate/2190-windows-package-phases
investigate/3543-macos-cli-deadline
perf/3281-reverse-tools-feedback-quality
fix/3406-hopper-doctor-fixture
fix/3341-wrapper-require-test-context
fix/3301-owned-uninstall-fixtures
fix/3164-compiler-input-ownership
fix/pcap-cleanup-stdout-newline-20261014
perf/interface-builder-summary
codex/review-fixes-pr-1977
fix/ghidra-effective-jvm-platform
fix/docs-turkish-rust-link-20261013
fix/main-maintenance-ci-20261010
fix/recover-binary-session-process-effects
codex/review-fixes-pr-2457
codex/ci-required-cancellation-gate
fix/main-format-baseline-20261013
fix/setup-preserve-entry-fields
cursor/restore-main-checks-1ffc
fix/ghidra-bridge-hashmap-import
codex/shared-ci-jadx-json-default-20261013
codex/shared-ci-ghidra-test-groups-20261013
codex/shared-ci-java-fixture-format-20261013
codex/fix-intrinsic-invocation-boundaries
test/release-preflight-reusable-jobs
test/js-parameter-provenance-expectation
fix/linux-hopper-verification-current
test/2419-ghidra-elf-probe-size
followup/pr-1544-native-ida
codex/fold-pr-2230-contribution
docs/readme-responsible-use
fix/issue-2064
fix/issue-2050
fix/issue-2053
fix/issue-1968
fix/issue-1945
experiment/codemode-bridge-20261011
fix/tool-effects-negative-wording-1904-20261012
fix/1842-electron-interop-provenance
feat/recover-javascript-multi-input
refactor/website-i18n-prep
fix/nativeaot-pe-virtual-extent
fix/browser-verifier-ci-hang
fix/pe-resources-input-selection
docs/beginner-friendly-guides
docs/beginner-setup-guide
fix/javascript-analysis-worker-1563
fix/1649-ghidra-duplicate-names
fix/javascript-export-keys-integration-1369
test/maintenance-boundary-contracts-20261011
review/javascript-export-keys-1369
review/process-live-progress-1483
test/javascript-1495-growth-ratio
fix/ci-escape-timing
docs/normalized-terminal-geometry-1450
release/6.3.0
archive/release-6.3.0-pr1381
release/6.2.0
fix/electron-preload-dynamic-override
fix/javascript-self-referential-bundler-edges
release/6.1.0
cursor/grok-client-cherry-pick-0b56
feat/signature-posture
feat/dyld-shared-cache
feat/artifact-integrity-policy
feat/pkg-inventory
release/6.0.0
chore/sync-release-5.0.0
release/5.0.0
cursor/cloud-agent-node-787e
fix/javascript-xhr-open-endpoints
review/pr-711-realpath-fallback-wording
cleanup/replay-confinement
codex/test-suite-performance
codex/issue-foundations
codex/address-open-issues-2026-07-20
agent/javascript-vite-rollup-esbuild-adapters
agent/process-cleanup
agent/triage-integration
agent/unknown-commands-registry
feat/mcp-identity-metadata
morlvps/issue_cleanup
codex/installer-redesign
morl/roadmap-investigation-core
morl/roadmap-investigation-docs
release-please--branches--main--components--rea
rea-agents-6.8.0
rea-agents-6.7.0
rea-agents-6.6.0
experiment/atomic-codemode-wait-runtime-20261016
rea-agents-6.5.0
rea-agents-6.4.0
rea-agents-6.3.0
rea-agents-6.2.0
rea-agents-6.1.0
rea-agents-6.0.0
rea-agents-5.0.0
rea-agents-4.1.0
rea-agents-4.0.1
rea-agents-4.0.0
rea-agents-3.2.1
rea-agents-3.2.0
rea-agents-3.1.0
rea-agents-3.0.0
rea-agents-2.7.0
rea-agents-2.6.0
rea-agents-2.5.1
rea-agents-2.5.0
rea-agents-2.4.0
rea-agents-2.3.0
rea-agents-2.2.0
rea-agents-2.1.0
rea-agents-2.0.0
rea-agents-1.7.0
rea-agents-1.6.0
rea-agents-1.5.0
rea-agents-1.4.0
rea-agents-1.3.0
rea-agents-1.2.0
rea-agents-1.1.0
rea-agents-1.0.0
rea-agents-0.5.0
rea-agents-0.4.0
rea-agents-0.3.0
rea-0.2.1
rea-0.2.0
Labels
Clear labels
area: bridge
area: bridge
area: build
area: build
area: build
area: cli
area: domain
area: evidence
area: mcp
area: native
area: providers
area: runtime
area: server
area: setup
area: tests
bug
design
documentation
enhancement
enhancement
enhancement
experiment
help wanted
i18n
invalid
P0: critical
P1: high
P2: medium
P2: medium
P2: medium
P3: low
performance
provider-request
pull-request
Mirrored from GitHub Pull Request
question
roadmap
triage
No labels
area: bridge
area: bridge
area: build
area: build
area: build
area: cli
area: domain
area: evidence
area: mcp
area: native
area: providers
area: runtime
area: server
area: setup
area: tests
bug
design
documentation
enhancement
enhancement
enhancement
experiment
help wanted
i18n
invalid
P0: critical
P1: high
P2: medium
P2: medium
P2: medium
P3: low
performance
provider-request
pull-request
question
roadmap
triage
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set.
Reference
morluto/rea#427
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @coygeek on GitHub (Oct 9, 2026).
Original GitHub issue: https://github.com/morluto/rea/issues/1193
Before submitting
Area
Native analysis or decompilation
Current limitation
REA imports an immutable private executable copy into its ephemeral Ghidra project. A dSYM beside the original Mach-O is not available beside that private copy. On an observed source-built C fixture, REA decompiles
pair_sumas two generated scalar parameters and cannot find its sourcePairtype, while an independent Ghidra session importing the original executable beside the matching dSYM recovers a single by-valuePairparameter, field names, source parameter names, and the type at/DWARF/fixture.c/Pair. This blocks an analyst who already owns the debug companion from obtaining Ghidra's more informative function semantics through REA.This is a new capability request. The current tool contracts promise recovered database observations and do not promise dSYM companion admission, so the observed difference is not asserted as a violation of that contract.
Use cases
Let a Ghidra analysis session include an explicitly selected matching dSYM companion so native decompilation, recovered API boundaries, and data-type inspection can use the debug information available to the analyst.
Direct Ghidra or GhidraMCP analysis beside the original executable recovers these facts, and an embedded-DWARF object works for source-controlled fixtures, but neither supplies a shipped linked executable plus its dSYM to REA's composed dossiers and comparisons.
Desired outcome and success criteria
Allow the caller to select a local dSYM companion when opening a native Mach-O for Ghidra analysis through CLI or MCP. Establish that the companion matches the selected executable before analysis. Preserve the existing immutable artifact behavior and ephemeral annotation lifecycle. Report whether debug information was admitted and used, retain its identity in the analysis evidence, and keep unsupported or mismatched companions explicit.
Function dossiers, pseudocode, native API inspection, and exact data-type inspection should expose the facts Ghidra recovers from the selected companion. Debug declarations and decompiler inferences must retain distinct attribution; using debug information does not make pseudocode original source.
Success criteria:
pair_sum's single by-valuePairparameter, its field names and 16-byte size, and expose/DWARF/fixture.c/Pairthrough exact type inspection.Authority boundaries and non-goals
Affected area: Native Ghidra target selection and its function-level CLI/MCP workflows. The existing private immutable import and evidence identity are binding constraints because the additional input must remain attributable without modifying the user's Ghidra installation or source artifacts.
Automatic symbol-server downloads, debugger execution, global filesystem searches for debug data, source-code reconstruction, and broad PDB or ELF debug-sidecar support are outside this request.
Alternatives considered
Direct Ghidra or GhidraMCP analysis beside the original executable already recovers the companion facts, but leaves the analyst unable to use those facts in REA's composed dossiers and comparisons. Compiling and selecting a DWARF-bearing object file works for source-controlled fixtures, but is not a replacement for analyzing a shipped linked executable and its existing dSYM. Explicit companion selection is preferable to automatically importing nearby files because it preserves the caller's chosen inputs and permits clear identity and mismatch checks.
Possible direction
No response
References
The observed comparison used
rea-agents@6.1.0and main commitb34bdcdb2877be394c59c9cbf70269dc1841ff78, Ghidra 12.1.4, OpenJDK 21.0.12.1, Node 24.21.0, and macOS 27 arm64. The independent oracle was bethington/ghidra-mcp stable v6.0.0 at commit8cd2078e10b9ba28b188cb84ce5b9051a904b995, built against that Ghidra install and run headlessly on loopback with a disposable project.The larger observed fixture contained this function and type. The following smaller source is an acceptance fixture, not a separately executed reduction.
For the executed control, the oracle returned
long pair_sum(Pair p)andreturn p.b * 3 + p.a;when the matching dSYM was beside the original file. Importing a byte-identical executable copy under a new basename without a dSYM returned the same generated scalar-parameter pseudocode as REA. That control establishes the companion-input difference rather than a decompiler disagreement. The exact-source DWARF-bearing object also gave REA a recoveredPairparameter, demonstrating that embedded debug facts already reach the function workflows.src/ghidra/GhidraTargetSnapshot.tsidentifies the executable-only immutable snapshot boundary.docs/native-investigation.md, "Native instruction, call and type primitives", defines exact database pathname inspection and database authority. Read-only issue searches for dSYM found no existing issue for this selected-companion workflow.Ghidra and Kuna-backend input control
A separate source-built arm64 Mach-O with
struct Sample { int count; int scale; }and its adjacent dSYM gave Ghidra 12.1.4 headless enough type information for both the stock decompiler and the released Kuna 1.989 Ghidra backend to render the named fields. Ghidra reported some unrecoverable DWARF frame/register expressions. On a byte-identical copy without the companion, both headless backends rendered integer-pointer expressions instead. Real REA Ghidra and independent Kuna function dossiers on the original executable also rendered integer-pointer expressions. The executable SHA-256 stayedc244f7d7d9fa9b7f4cfcb1f69d69cc1f83ad98fe38b0293b223b3ca7d9076363; neither copy was executed.This independently supports the selected-companion concern for one additional fixture and shows why changing decompiler backend alone does not substitute for binding debug inputs. It does not demonstrate a general dSYM import guarantee, prove all debug facts were applied, or test an REA hybrid backend. See #8177 for the complete experimental scope.
Existing-project workaround and offline handoff
For the typed fixture above, I imported the executable with its adjacent dSYM into a disposable Ghidra 12.1.4 project and saved it. Real REA/Ghidra, configured with that explicitly selected project and program, opened its private copy and
analyze_function(0x100000410)returnedSample *and both named fields in full and compact MCP profiles. The session Evidence reported a selected-project fingerprint and unknown original analysis completeness/settings; it did not independently identify the dSYM or certify which prior input produced the fields. The original project's ten regular files and the executable remained byte-identical through both REA sessions.Each session's exported dossier was identical to its live record. A fresh target-free MCP server imported each bundle and paged the retained pseudocode, preserving both field names in both profiles. This is a usable workaround when the analyst already has a suitable project, not direct dSYM selection or independently verified companion provenance. Ghidra's project-import log reported the same DWARF frame/register errors noted above. The project was created specifically for this control and the target was never executed.
@jimpablo commented on GitHub (Oct 12, 2026):
I'd like to work on this. Environment is ready: macOS 27 arm64, Ghidra 12.1.4 (Homebrew formula build, native
mac_arm_64decompiler verified byrea doctor), JDK accepted.Reproduced the baseline with a two-step fixture (
clang -O0 -g -c pair.c→ link →dsymutil pair -o pair.dSYM, so the DWARF companion is real and sits beside the original executable):rea function <pair> _pair_sum --provider ghidra --json):native_api.signature_sourceisdefault, return-type confidencelow— the private ephemeral import has no debug companion, exactly as reported.Pairparameter per the report; I will re-verify it on this host as part of the change.Planned direction, following the tool-design guide and the caller-selected-input rule:
LC_UUID(reject mismatches with an honest, typed reason rather than silently loading a non-matching companion), record both digests as Evidence, and stage the companion beside the private import so Ghidra's DWARF applies to decompilation, recovered types, and parameter names.One design question before I start: should companion admission also apply to the already-open-session route (open_binary) only, or also to one-shot commands (
rea functionetc.)? My default is both, since both share the same import path — I'll follow whatever the maintainers prefer.@matbrgz commented on GitHub (Oct 12, 2026):
Symbol Binding & dSYM Invariants Review
Staging and binding companion Apple
dSYMbundles during headless Ghidra Mach-O analysis bridges a major symbol recovery gap on macOS:LC_UUIDload command MUST strictly match the target Mach-O'sLC_UUID. If the UUIDs differ, REA must fail closed withdsym_uuid_mismatchrather than attributing mismatched DWARF symbol names..dSYMbundle alongside it so Ghidra's DWARF analyzer can automatically ingest functions, parameter types, and line numbers.