Hmbown/CodeWhale · error
loaded-image mapping for updater marker has no pathname
Error message
loaded-image mapping for updater marker has no pathname
What it means
parse_android_image_mapping extracts the trailing pathname field of a /proc/self/maps line; the remainder after fixed fields becomes the path (rejoined, since paths may contain spaces). It bails when this collected path is empty — the mapping has no backing pathname, so the updater cannot name the file backing its loaded image.
Solutions
- Skip to the next /proc/self/maps line with a non-empty pathname that covers the marker address.
- Run the binary from an on-disk path so its mapping reports a pathname.
- Fall back to /proc/self/exe or dladdr-based resolution for the executable identity.
- Use the platform's update channel instead of in-place self-update for anonymous-mapped execution.
Example fix
// before
if path.is_empty() {
bail!("loaded-image mapping for updater marker has no pathname");
}
// after (scanner fix)
// continue to the next maps line; only a mapping with a non-empty
// pathname and matching address range counts as proof Defensive patterns
Strategy: validation
Validate before calling
// a usable maps line has a path column let has_path = line.split_whitespace().count() >= 6;
Type guard
fn maps_line_has_path(fields: &[&str]) -> bool { fields.len() >= 6 } Try / catch
match parse_android_image_mapping(line) {
Err(e) if e.to_string().contains("no pathname") => continue, // anonymous mapping; try next line
other => other?,
} Prevention
- Only treat maps lines with a trailing pathname as file-backed proof.
- Fall back to /proc/self/exe when no maps line with a pathname covers the marker.
- Run the updater binary from a persistent on-disk path.
When it happens
Trigger: android_loaded_executable_proof_report on a maps line for the marker where all fixed columns parse but the trailing path column is absent/empty (anonymous mapping line with no path suffix).
Common situations: Anonymous executable mappings (heap/JIT or memfd) matched during the marker scan; minimal Android environments with unusual map entries; deleted files still typically show a path, so empty usually means truly anonymous.
Understand the failure class
Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.
Related errors
- loaded-image mapping for updater marker has no file inode
- loaded-image mapping for updater marker is not executable
- Android dladdr could not locate the updater's loaded image
- Android dladdr returned an empty loaded-image path
- Android identifies runtime linker ` `; refusing to use the…
AI-assisted analysis of Hmbown/CodeWhale@73e0f67d83 (2026-09-22).
Data as JSON: /api/errors/fea6d22ebe48b5ab.
Report an issue: GitHub.
Appendix: source
Thrown at crates/cli/src/update.rs:398
.parse::<u64>()
.context("loaded-image mapping has an invalid inode")?;
let path = fields.collect::<Vec<_>>().join(" ");
if permissions.as_bytes().get(2) != Some(&b'x') {
bail!("loaded-image mapping for updater marker is not executable");
}
if inode == 0 {
bail!("loaded-image mapping for updater marker has no file inode");
}
let (device_major, device_minor) = device
.split_once(':')
.context("loaded-image mapping has an invalid device")?;
let device_major = u32::from_str_radix(device_major, 16)
.context("loaded-image mapping has an invalid device major number")?;
let device_minor = u32::from_str_radix(device_minor, 16)
.context("loaded-image mapping has an invalid device minor number")?;
if path.is_empty() {
bail!("loaded-image mapping for updater marker has no pathname");
}
let mapping = AndroidImageMapping {
start,
end,
device_major,
device_minor,
inode,
path: PathBuf::from(path),
};
if matching.replace(mapping).is_some() {
bail!("multiple /proc/self/maps rows contain the updater marker");
}
}
matching.ok_or_else(|| anyhow!("no /proc/self/maps row contains the updater marker"))
}
View on GitHub (pinned to 73e0f67d83)