Hmbown/CodeWhale · error · anyhow::Error
loaded-image mapping for updater marker is not executable
Error message
loaded-image mapping for updater marker is not executable
What it means
Raised while parsing /proc/self/maps for the row whose address range contains the updater marker function: that row's permission field has no 'x' at position 2 (e.g. rw-p or r--p). The updater only trusts an executable, file-backed mapping as the image it may replace. Since the marker is a function, its address should sit in an r-xp segment; a non-executable row means the mapping layout is unexpected and the updater refuses to continue.
Source
Thrown at crates/cli/src/update.rs:353
let permissions = fields
.next()
.context("loaded-image mapping is missing permissions")?;
let _offset = fields
.next()
.context("loaded-image mapping is missing its file offset")?;
let device = fields
.next()
.context("loaded-image mapping is missing its device")?;
let inode = fields
.next()
.context("loaded-image mapping is missing its inode")?
.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,View on GitHub (pinned to 0c42157ee5)
Solutions
- Restart the process and retry the update; transient maps state from partial page-in can clear
- Reinstall the binary with the documented installer and retry the self-update
- If it reproduces, attach the /proc/self/maps output and device/Android version to a bug report
Defensive patterns
Strategy: try-catch
Try / catch
Catch the update error and, when the message contains 'not executable' and '/proc/self/maps' context, surface a 'self-update unavailable in this environment; update manually' message rather than retrying in a loop.
Prevention
- Run the CLI from a standard exec launch so its code segment is mapped r-xp
- Avoid hardened/patched loaders for this binary
- Report reproductions with /proc/self/maps attached
When it happens
Trigger: Android self-update where parse_android_image_mapping finds the marker address inside a mapping flagged non-executable - e.g. the symbol address was resolved into a data/relro segment, or an unusual loader maps the image without exec permissions on that range.
Common situations: Hardened/patched loaders, unusual RELRO layouts, emulators, or corrupted maps state on specific ROMs; essentially always an environment anomaly rather than a config mistake.
Related errors
- loaded-image mapping for updater marker has no file inode
- loaded-image mapping for updater marker has no pathname
- multiple /proc/self/maps rows contain the updater marker
- no /proc/self/maps row contains the updater marker
- Android dladdr could not locate the updater's loaded image
AI-assisted analysis of Hmbown/CodeWhale@0c42157ee5 (2026-08-20).
Data as JSON: /api/errors/0f73d60e1a0aadf3.
Report an issue: GitHub.