Hmbown/CodeWhale · error · anyhow::Error
Android {authority} identifies runtime linker `{}`; refusing
Error message
Android {authority} identifies runtime linker `{}`; refusing to use the linker as an update target What it means
validate_android_reported_path (applied to each authority separately: dladdr or /proc/self/maps) found the reported path names Bionic's runtime linker. Updating would overwrite a system component, so the check refuses; this is the per-authority form of the linker guard that also exists after the two authorities are joined.
Source
Thrown at crates/cli/src/update.rs:461
})
}
#[cfg(any(target_os = "android", all(test, unix)))]
fn validate_android_reported_path(authority: &str, path: &Path) -> Result<()> {
if !path.is_absolute() {
bail!(
"Android {authority} reported non-absolute loaded-image path `{}`",
path.display()
);
}
if path.to_string_lossy().ends_with(" (deleted)") {
bail!(
"Android {authority} reported deleted loaded image `{}`",
path.display()
);
}
if is_android_linker_name(path) {
bail!(
"Android {authority} identifies runtime linker `{}`; refusing to use the linker as an update target",
path.display()
);
}
Ok(())
}
#[cfg(any(target_os = "android", all(test, unix)))]
fn validate_android_mapping_identity(
mapping: &AndroidImageMapping,
candidate: &Path,
) -> Result<()> {
use std::os::unix::fs::MetadataExt;
let candidate_metadata = std::fs::metadata(candidate).with_context(|| {
format!(
"failed to stat Android update target {}",
candidate.display()View on GitHub (pinned to 0c42157ee5)
Solutions
- Launch the binary directly (exec) instead of loading it through the linker or a wrapper
- Reinstall using the documented Android method and retry
- Report the authority name and path from the message for triage
Defensive patterns
Strategy: try-catch
Try / catch
Catch and stop: the authority name in the message tells you which source (dladdr or maps) implicated the linker; report the launch configuration rather than retrying.
Prevention
- Exec the binary directly instead of loading it through linker namespaces
- Avoid wrappers that dlopen the program image
- Reinstall via documented methods when launchers change
When it happens
Trigger: Android self-update where one authority's raw path already matches is_android_linker_name (e.g. /system/bin/linker64, /apex/com.android.art/bin/linker64, ld-android.so) before canonicalization and comparison.
Common situations: Same class as the post-join linker refusal: dlopen-based launchers, mispackaged builds, linker-namespace quirks on specific Android versions.
Related errors
- Android loaded-image authorities resolved to runtime linker
- Android dladdr could not locate the updater's loaded image
- Android dladdr returned an empty loaded-image path
- loaded-image mapping for updater marker is not executable
- loaded-image mapping for updater marker has no file inode
AI-assisted analysis of Hmbown/CodeWhale@0c42157ee5 (2026-08-20).
Data as JSON: /api/errors/980f29fbe72e7540.
Report an issue: GitHub.