feat(apple): join IPS images to admitted Mach-O slices (#9570)

* feat(apple): join Apple IPS frames to a selected Mach-O or dSYM slice

inspect_apple_ips reported every image UUID as unknown and stated that joined
frames were unobserved. Accept an optional join_path, read its LC_UUID and
__TEXT vmaddr with the existing bounded stable-artifact reader, and match by
canonical UUID plus architecture.

A frame joins only when exactly one slice carries the image UUID and an
agreeing architecture, so arm64 and arm64e never cross, all-zero UUIDs never
join, and a conflicted or unreadable artifact stays typed instead of guessed.
Joined frames report the slice __TEXT vmaddr plus the recorded imageOffset as
a static address, which is the value atos resolves for the same report.
Symbolication is still not performed.

* refactor(apple): remove superseded join integer type import

* fix(apple): share FAT admission and preserve completed join facts

* fix(apple): bind standalone joins to admitted source identity

---------

Co-authored-by: 2SinceJuly <202121119+2SinceJuly@users.noreply.github.com>
Co-authored-by: morluto <76467478+morluto@users.noreply.github.com>
This commit is contained in:
authored and GitHub committed 2026-11-09 20:20:33 +08:00
1 parent 645735fc0f
commit 97b5503f39
15 files changed
+1376 -45

No files matched your search

+13
View File
@@ -109,6 +109,15 @@ export const registerBinaryDiagnosticsCommands = (
maxIntegerTextBytes: cliDecimalField(
inspectAppleIpsInputSchema.shape.max_integer_text_bytes,
),
joinPath: z
.string()
.optional()
.describe(
"Optional local Mach-O executable or dSYM whose slice LC_UUID matches report images",
),
maxJoinBytes: cliDecimalField(
inspectAppleIpsInputSchema.shape.max_join_bytes,
),
}),
run: ({ args, options }) =>
withCommandCancellation(async (signal) => {
@@ -129,6 +138,10 @@ export const registerBinaryDiagnosticsCommands = (
max_images: options.maxImages,
max_registers: options.maxRegisters,
max_integer_text_bytes: options.maxIntegerTextBytes,
...(options.joinPath === undefined
? {}
: { join_path: absoluteCallerPath(options.joinPath) }),
max_join_bytes: options.maxJoinBytes,
},
{ signal },
),