new file mode 100644
@@ -0,0 +1,123 @@
+From f936d6a954455eff3a60968d155852f9de730228 Mon Sep 17 00:00:00 2001
+From: Sunil Dora <sunilkumar.dora@windriver.com>
+Date: Sun, 27 Sep 2026 08:47:23 +0530
+Subject: [PATCH] fix(compile): Keep host deps out of the target `-C metadata`
+ hash
+
+A target unit's `-C metadata` mixed in the `c_metadata` of its
+host-kind dependencies (build scripts, proc-macros). Their dependency
+graph depends on the host `cfg`, e.g. `cpufeatures` pulls in `libc`
+only on aarch64-linux, so the build host leaked into the symbols of
+cross-compiled crates such as rustdoc.
+
+Host-kind dependencies are not linked into the target artifact, so use
+their package id instead. `unit_id`, `-C extra-filename` and
+fingerprints are unchanged, as are host units and builds without
+`--target`. The upstream PR also adds a testsuite test that fakes the
+reported host; it is not carried here.
+
+Upstream-Status: Submitted [https://github.com/rust-lang/cargo/pull/17522]
+Signed-off-by: Sunil Dora <sunilkumar.dora@windriver.com>
+---
+
+diff --git a/src/tools/cargo/src/compiler/build_runner/compilation_files.rs b/src/tools/cargo/src/compiler/build_runner/compilation_files.rs
+index 593e57e..63855f3 100644
+--- a/src/tools/cargo/src/compiler/build_runner/compilation_files.rs
++++ b/src/tools/cargo/src/compiler/build_runner/compilation_files.rs
+@@ -89,6 +89,8 @@ impl fmt::Debug for UnitHash {
+ /// mangled symbols need to be stable between different builds with different
+ /// settings. For example, profile-guided optimizations need to swap
+ /// `RUSTFLAGS` between runs, but needs to keep the same symbol names.
++/// Likewise a target unit only mixes the package id of its host-kind
++/// dependencies into `c_metadata`, see `compute_metadata`.
+ #[derive(Copy, Clone, Debug)]
+ pub struct Metadata {
+ unit_id: UnitHash,
+@@ -744,7 +746,7 @@ fn compute_metadata(
+ let deps_metadata = build_runner
+ .unit_deps(unit)
+ .iter()
+- .map(|dep| *metadata_of(&dep.unit, build_runner, metas))
++ .map(|dep| (&dep.unit, *metadata_of(&dep.unit, build_runner, metas)))
+ .collect::<Vec<_>>();
+ let c_extra_filename = use_extra_filename(bcx, unit);
+ let pkg_dir = use_pkg_dir(bcx, unit);
+@@ -843,16 +845,28 @@ fn compute_metadata(
+
+ let mut c_metadata_hasher = shared_hasher.clone();
+ // Mix in the target-metadata of all the dependencies of this target.
++ // Host-kind deps of a target unit (build scripts, proc-macros) are not
++ // linked into it, and their metadata depends on the build host, so use
++ // a host independent stand-in for them (rust-lang/cargo#8140).
+ let mut dep_c_metadata_hashes = deps_metadata
+ .iter()
+- .map(|m| m.c_metadata)
++ .map(|(dep, m)| {
++ if !unit.kind.is_host() && dep.kind.is_host() {
++ host_independent_c_metadata(dep, ws_root)
++ } else {
++ m.c_metadata
++ }
++ })
+ .collect::<Vec<_>>();
+ dep_c_metadata_hashes.sort();
+ dep_c_metadata_hashes.hash(&mut c_metadata_hasher);
+
+ let mut unit_id_hasher = shared_hasher.clone();
+ // Mix in the target-metadata of all the dependencies of this target.
+- let mut dep_unit_id_hashes = deps_metadata.iter().map(|m| m.unit_id).collect::<Vec<_>>();
++ let mut dep_unit_id_hashes = deps_metadata
++ .iter()
++ .map(|(_, m)| m.unit_id)
++ .collect::<Vec<_>>();
+ dep_unit_id_hashes.sort();
+ dep_unit_id_hashes.hash(&mut unit_id_hasher);
+ // Avoid trashing the caches on RUSTFLAGS changing via `unit_id`
+@@ -884,6 +898,15 @@ fn compute_metadata(
+ }
+ }
+
++/// Stand-in `c_metadata` for a host-kind dependency of a target unit:
++/// only the dependency's package id, see `compute_metadata`.
++fn host_independent_c_metadata(dep: &Unit, ws_root: &Path) -> UnitHash {
++ let mut hasher = StableHasher::new();
++ METADATA_VERSION.hash(&mut hasher);
++ dep.pkg.package_id().stable_hash(ws_root).hash(&mut hasher);
++ UnitHash(Hasher::finish(&hasher))
++}
++
+ /// HACK: Detect the *potential* presence of `--remap-path-prefix`
+ ///
+ /// As CLI parsing is contextual and dependent on the CLI definition to understand the context, we
+diff --git a/src/tools/cargo/src/compiler/fingerprint/mod.rs b/src/tools/cargo/src/compiler/fingerprint/mod.rs
+index 172165d..d7f1e55 100644
+--- a/src/tools/cargo/src/compiler/fingerprint/mod.rs
++++ b/src/tools/cargo/src/compiler/fingerprint/mod.rs
+@@ -74,7 +74,7 @@
+ //! `TargetKind` (bin/lib/etc.) | ✓ | ✓ | ✓
+ //! Enabled Features | ✓ | ✓ | ✓
+ //! Declared Features | ✓ | |
+-//! Immediate dependency’s hashes | ✓[^1] | ✓ | ✓
++//! Immediate dependency’s hashes | ✓[^1] | ✓ | ✓[^9]
+ //! [`CompileKind`] (host/target) | ✓ | ✓ | ✓
+ //! `__CARGO_DEFAULT_LIB_METADATA`[^4] | | ✓ | ✓
+ //! `__CARGO_RUSTC_BOOTSTRAP_WS_REMAP`[^2] | ✓ | |
+@@ -91,7 +91,7 @@
+ //! `[lints.rust.unexpected_cfgs.check-cfg]` | ✓ | |
+ //! `--extern priv:` | ✓ | |
+ //!
+-//! [^1]: Bin dependencies are not included.
++//! [^1]: Bin dependencies other than artifact dependencies are not included.
+ //!
+ //! [^2]: `__CARGO_RUSTC_BOOTSTRAP_WS_REMAP` is set by rustc bootstrap
+ //! to customize remap-path-prefix
+@@ -111,6 +111,9 @@
+ //!
+ //! [^8]: including `-Cextra-filename`
+ //!
++//! [^9]: For a target-kind unit, host-kind dependencies (build scripts,
++//! proc-macros) contribute only their `package_id`.
++//!
+ //! When deciding what should go in the Metadata vs the Fingerprint, consider
+ //! that some files (like dylibs) do not have a hash in their filename. Thus,
+ //! if a value changes, only the fingerprint will detect the change (consider,
@@ -8,6 +8,7 @@ SRC_URI += "https://static.rust-lang.org/dist/rustc-${RUST_VERSION}-src.tar.xz;n
file://0003-bootstrap-skip-StdarchVerify-when-remote-testing.patch;patchdir=${RUSTSRC} \
file://0004-cargo-omit-host-triple-from-unit-metadata-hash.patch;patchdir=${RUSTSRC} \
file://0005-rustc-span-make-hygiene-encoding-order-deterministic.patch;patchdir=${RUSTSRC} \
+ file://0006-cargo-keep-host-deps-out-of-the-target-C-metadata-hash.patch;patchdir=${RUSTSRC} \
"
SRC_URI[rust.sha256sum] = "6451598a99e77f07571960f6b21d577399d3a30f33e80cbd2e3a4aae6535d265"