mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 06:45:22 +00:00
[GH-ISSUE #7208] [Bug] Ghidra: "Required Objective-C data type not found … Try adding libobjc.dylib" on macOS Mach-O gives callers no actionable recovery #4300
Closed
opened 2026-10-31 00:48:41 +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#4300
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 @kaoru0822-kitauji on GitHub (Oct 26, 2026).
Original GitHub issue: https://github.com/morluto/rea/issues/7208
Originally assigned to: @kaoru0822-kitauji on GitHub.
Before submitting
Objective-C Message Analyzerfailure, a stall), #1048 (large-target startup deadline).Area
Native analysis or decompilation (Ghidra provider, macOS Mach-O)
Observed behavior
A user on Discord reports that analyzing a macOS game executable (Transport Fever 3) with the Ghidra provider fails, and the output they see is:
The binary links
/usr/lib/libobjc.A.dylib. On modern macOS that library exists only in the dyld shared cache, not on disk, and REA has no setting for "adding" a library, so the user is stuck. We do not have the user's full REA result, so we don't know itsfailure_kindor whether the session actually failed or just logged this line.Source-derived (not run against real Ghidra; it isn't installed here): this line is non-fatal Ghidra auto-analysis output. Adding libobjc would not help in REA's headless import.
ObjcMessageAnalyzer.getDataTypes(Ghidra 12.1.4:Ghidra/Features/Decompiler/.../ObjcMessageAnalyzer.java:206-207; 12.2/master:Features/Objective-C/...:207-208) looks up/_objc2_/ID,/_objc2_/SELand/_objc2_/class_tin the program's own data type manager. If any are missing, it logs these two lines andadded()returnsfalse.Objective-C Type Metadata Analyzer(FORMAT_ANALYSIS, runs earlier) createsclass_twhen it marks up a class from__objc_classlist(Objc2Class.NAME). It createsID/SELonly as typedefs while decoding method type encodings (Objc1TypeEncodings.createProperDataType). Any exception during that markup is also caught and dropped silently (ObjcTypeMetadataAnalyzer.added:catch (Exception e) { return false; }).ObjcMessageAnalyzer.canAnalyzeonly requires a__objc_*block plus__objc_stubsor an external_objc_msgSend*symbol. So a program that calls Objective-C but defines no classes or methods enables the analyzer without ever creating its types. A C++ engine with thin Cocoa glue is a common case of that. The same happens to a program whose metadata markup throws.AnalysisScheduleronly ORsadded()'s return value into its "changed" result (result |= analyzer.added(...)). Analysis continues. The analyzer simply skipsobjc_msgSendcall-target recovery.libobjc.A.dylibas a library would create a separate program; it would not add these types to the target's data type manager. REA always imports into an ephemeral project (-import … -readOnly -deleteProject) with default loader options anyway.So if the user's session did fail, the cause is most likely something else, and this line is just the most visible one in the Ghidra diagnostics. For a large game executable, a likely candidate is the import plus auto-analysis startup deadline (#1048). That is a hypothesis; the user's
failure_kindis needed to confirm it.Reproduction
Partial: the binary structure was checked; Ghidra was not run.
Observed (Apple clang 21.0.0, macOS 26.7.1, arm64):
noclass:__objc_imageinfo,__objc_selrefs,__objc_methname,__objc_stubs. There is no__objc_classlistor__objc_methtype, so by (2)–(3) the message analyzer runs butID/SEL/class_tare never created. Expected to log the reported lines.withclass(the same program plus one@implementation Greeter : NSObjectwith one method): adds__objc_classlist,__objc_methlistand__objc_methtype(@24@0:8@16). Expected not to log them.ls /usr/lib/libobjc.A.dylib→No such file or directory, although both binaries link it.Proposed real-provider check: run
rea function ./noclass main --jsonand the same for./withclasswith Ghidra 12.1.4. Confirm that the line appears only fornoclass, that both sessions open and answer, and recordanalysis_complete.Expected behavior
Impact and scope
The user can't tell what failed or what to change. They may go looking for a libobjc file that doesn't exist on disk. Whether REA itself mis-classifies anything is unknown: we need the user's full result.
Proposed fix
REA_GHIDRA_DISABLED_ANALYZERSsection indocs/installation.md. Say that the line is Ghidra analyzer output and not an REA failure, that there is no libobjc to add, and to check the session'sfailure_kindfor the real cause. To silence the analyzer, setREA_GHIDRA_DISABLED_ANALYZERS="Objective-C Message Analyzer". For large executables, raiseREA_GHIDRA_STARTUP_TIMEOUT_MSand the Ghidra heap./_objc2_types when the program is Objective-C 2 and the analyzer is enabled. If they are missing, it reports a limitation such as "Objective-C message-send targets were not resolved: the program defines no Objective-C class metadata". That is a typed fact from the program, not a parse of Ghidra's log, so it survives Ghidra changing its wording./_objc2_basics itself, or not enable when the program has no class metadata, and drop the "Try adding libobjc.dylib" advice.We are not proposing to create the
/_objc2_types in a pre-script. That would conflict with the types the metadata analyzer creates, and it would turn on a parallel decompile of every function. #1783 shows that path can stall for a long time on large programs.REA version
main at
b3818bbba(source analysis)Runtime and platform
Repro build: macOS 26.7.1 arm64, Apple clang 21.0.0. Ghidra not installed here. The user's REA, Ghidra and JDK versions: NOT_ENOUGH_INFO.
Target and artifact context
Thin or universal Mach-O game executable linking
libobjc.A.dylib. The user's slice, size and architecture: NOT_ENOUGH_INFO.Earliest failure stage
Unknown. The full REA result (
failure_kind,analysis_complete) is needed.Relevant output or evidence
Ghidra_12.1.4_build:Ghidra/Features/Decompiler/src/main/java/ghidra/app/plugin/core/analysis/ObjcMessageAnalyzer.java(getDataTypes,canAnalyze).Ghidra/Features/Objective-C/src/main/java/ghidra/app/plugin/core/analysis/ObjcTypeMetadataAnalyzer.java,.../objc/objc1/Objc1TypeEncodings.java,.../objc/objc2/Objc2Constants.java.AnalysisScheduler.java:result |= analyzer.added(...).otool -lsection lists above.@XinwangTao commented on GitHub (Oct 26, 2026):
这个分析很扎实,尤其是第 5 点——加载 libobjc.A.dylib 只会生成一个独立 program,并不会把 /objc2 类型注入目标程序的数据类型管理器,这直接说明 Ghidra 的建议在 REA 的 headless 导入场景下确实不可操作,用户照着去找 libobjc 文件只会白费功夫。
补充一个思路供参考:proposed fix 的第 2 点(结构化事实)其实可以不依赖 Ghidra 侧——REA 在 pre-analysis 阶段就能从 Mach-O 的 LC_LOAD_DYLIB 看出目标链接了 libobjc,同时检查 section 里有没有 __objc_classlist;两者组合(链接了 ObjC 运行时 + 无 class metadata)即可提前产出同样的 typed limitation,不用等 Ghidra 跑完再解析它的日志。文档条目先上是合理的,建议在 troubleshooting 里顺带注明现代 macOS 上 /usr/lib/libobjc.A.dylib 只在 dyld shared cache 中存在这一事实,避免用户去文件系统里找。
@XinwangTao commented on GitHub (Oct 28, 2026):
The #7249 doc clarification is exactly the right first fix — with libobjc.A.dylib living only in the dyld shared cache on modern macOS, telling users to "add libobjc.dylib" was a dead end, and the troubleshooting note now makes the limitation actionable instead. Worth keeping the earlier suggestion on the table as a follow-up: detect at pre-analysis time (LC_LOAD_DYLIB shows libobjc linked, and no __objc_classlist section) and emit the typed limitation before Ghidra ever runs, so callers get a structured fact rather than a log line.