Merge branch 'feat/dylib-resolution' into feat/dyld-shared-cache

This commit is contained in:
Kaoru0822 2026-10-07 13:33:40 +00:00
commit ed40d2e001
2 changed files with 24 additions and 10 deletions

View File

@ -755,7 +755,13 @@ describe("conditional loads", () => {
[VENDOR]: parsed(
slice({
install_name: "@rpath/libvendor.dylib",
dependencies: [dependency("@loader_path/libgone.dylib")],
dependencies: [
dependency("@loader_path/libgone.dylib"),
dependency("@loader_path/libweak.dylib", { weak: true }),
dependency("@loader_path/liblazy.dylib", {
command: "LC_LAZY_LOAD_DYLIB",
}),
],
}),
),
[OTHER]: parsed(
@ -777,9 +783,14 @@ describe("conditional loads", () => {
resolution: { status: "conditional", image: VENDOR },
loader_conditional: false,
});
expect(
trace.findings.find(({ kind }) => kind === "required-load-unresolved")
?.explanation,
).toContain(`${VENDOR} loads only conditionally`);
// Required, weak and lazy findings below the fallback are all qualified.
for (const kind of [
"required-load-unresolved",
"weak-load-unresolved",
"lazy-load-unresolved",
])
expect(
trace.findings.find((finding) => finding.kind === kind)?.explanation,
).toContain(`${VENDOR} loads only conditionally; if it loads,`);
});
});

View File

@ -61,24 +61,27 @@ const unresolvedFinding = (edge: Edge, index: number): Finding => {
image: edge.loader,
basis: "derived",
} as const;
const missing = `No candidate for ${edge.command === "LC_LAZY_LOAD_DYLIB" ? "lazily loaded " : edge.weak ? "weak dependency " : ""}${edge.install_name} exists in the analyzed root`;
// Below a conditional fallback, every consequence applies only if it loads.
const when = edge.loader_conditional
? `. ${edge.loader} loads only conditionally; if it loads, `
: "; ";
if (edge.command === "LC_LAZY_LOAD_DYLIB")
return {
...base,
kind: "lazy-load-unresolved",
explanation: `No candidate for lazily loaded ${edge.install_name} exists in the analyzed root; dyld loads it on first use, which would fail unless the image is supplied elsewhere.`,
explanation: `${missing}${when}dyld loads it on first use, which would fail unless the image is supplied elsewhere.`,
};
return edge.weak
? {
...base,
kind: "weak-load-unresolved",
explanation: `No candidate for weak dependency ${edge.install_name} exists in the analyzed root; dyld continues without it.`,
explanation: `${missing}${when}dyld continues without it.`,
}
: {
...base,
kind: "required-load-unresolved",
explanation: edge.loader_conditional
? `No candidate for ${edge.install_name} exists in the analyzed root. ${edge.loader} loads only conditionally; if it loads, dyld would fail to launch ${edge.root} (${edge.architecture}) unless the image is supplied elsewhere.`
: `No candidate for ${edge.install_name} exists in the analyzed root; dyld would fail to launch ${edge.root} (${edge.architecture}) unless the image is supplied elsewhere.`,
explanation: `${missing}${when}dyld would fail to launch ${edge.root} (${edge.architecture}) unless the image is supplied elsewhere.`,
};
};