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

  1. Restart the process and retry the update; transient maps state from partial page-in can clear
  2. Reinstall the binary with the documented installer and retry the self-update
  3. 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

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


AI-assisted analysis of Hmbown/CodeWhale@0c42157ee5 (2026-08-20). Data as JSON: /api/errors/0f73d60e1a0aadf3. Report an issue: GitHub.