Skip to content

Bundled ldid is from 2022; apps signed for iOS 26/27 install but fail to launch (EBADEXEC) #137

Description

@Rogue911

Summary

Apps signed by this project install successfully on iOS 26 and iOS 27 but refuse to launch.
The device log reports NSPOSIXErrorDomain code 85 (EBADEXEC, "rejected code signature").
The cause is the vendored ldid: upstream_repo is pinned to a commit from April 2022,
and that ldid predates the signature layout newer iOS builds accept.

Detail

upstream_repo currently points at 071b1dd ("Updates version to 1.5.0.0", 2022-04-25).
Note that origin/master of that repository is even older (2021-07-01) — active work lives
on other branches.

rileytestut/AltServer-Windows has since updated ldid to match the AltStore/AltServer macOS
version, in commit 62a7a2b ("[ldid] Updates ldid to match AltStore + AltServer macOS'
version", 2026-03-23), which is on the 26.4_fix branch. Building with ldid from that commit
produces bundles that launch normally on iOS 27.

Why a plain submodule bump does not work

Moving the submodule to 62a7a2b does not build. The newer tree also updates the AltServer
sources, which pull in Windows headers that this project's shims do not currently provide:

build/AltServer_patched/AltServerApp.cpp:10:10: fatal error: Guiddef.h: No such file or directory
build/AltServer_patched/AltInclude.h:3:10:     fatal error: windows.h: No such file or directory

So the bump needs shim work alongside it, or ldid needs to be taken in on its own.

A second, smaller problem that surfaces with the new ldid

AltSign/Signer.cpp builds ldid's root path as:

ldid::DiskFolder appBundle(app.path() + "\\");

Newer ldid joins its root with each relative path without inserting a separator, and expects
the root to already end in one. On Linux the Windows backslash is not a separator, so entries
come out as App.app\Info.plist and signing produces an unusable bundle.

This fits the existing rewrite mechanism — makefiles/AltSign-build/rewrite_ldid_source.py
already converts \\ to / for ldid's own sources, but
rewrite_altsign_source.py does not do the same for AltSign. A one-line rule there is enough:

content = content.replace(b'app.path() + "\\\\"', b'app.path() + "/"')

A blanket backslash rewrite would be riskier: AltSign/Archiver.cpp also contains
char ALTDirectoryDeliminator = '\\';, which is the only other occurrence in AltSign and is
better left alone.

Environment

I am happy to prepare a pull request if you have a preference for the approach — bumping the
submodule and extending the shims, or vendoring ldid separately.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions