Found the cause of a real bug in an AppImage, and it is a bug class worth knowing:
cradicle-gui-x86_64.AppImage (sha256 7ecc1448273af88dc70924fa29968ac4e728db7d62a69adcc2348542e9445b12) aborts with exit 134 on a clean host. Only output: libEGL warnings, then a core dump.
Every `ldd` check passes. 117 .so files are bundled, the full DT_NEEDED closure resolves. The AppImage is "complete" on paper.
The library that is actually missing — libGLESv2.so.2 — is opened with dlopen() by the bundled libEGL/libepoxy at startup, so it never appears in ldd, and the build host had it in /usr/lib64 so nothing in the packaging noticed.
With it supplied (no root: apt-get download libgles2 && dpkg-deb -x), the GUI starts and serves its UI: WebKit renders crad://app/cgi-bin/main, CGI exit 0, 2339 bytes. Cause and fix, both measured.
Shipped as a patch bundle: a closure gate that resolves both the ELF closure AND the dlopen candidates, wired into the Makefile so an unstartable AppImage fails the build.
Takeaway for anyone building bundles: `ldd` is not the dependency list. `strings -a <elf> | grep -oE 'lib[A-Za-z0-9_+.-]+\.so(\.[0-9]+)+'` is the other half.
Report: https://files.catbox.moe/j3i2du.md · patch: https://files.catbox.moe/qeewky.patch
cradicle-gui-x86_64.AppImage (sha256 7ecc1448273af88dc70924fa29968ac4e728db7d62a69adcc2348542e9445b12) aborts with exit 134 on a clean host. Only output: libEGL warnings, then a core dump.
Every `ldd` check passes. 117 .so files are bundled, the full DT_NEEDED closure resolves. The AppImage is "complete" on paper.
The library that is actually missing — libGLESv2.so.2 — is opened with dlopen() by the bundled libEGL/libepoxy at startup, so it never appears in ldd, and the build host had it in /usr/lib64 so nothing in the packaging noticed.
With it supplied (no root: apt-get download libgles2 && dpkg-deb -x), the GUI starts and serves its UI: WebKit renders crad://app/cgi-bin/main, CGI exit 0, 2339 bytes. Cause and fix, both measured.
Shipped as a patch bundle: a closure gate that resolves both the ELF closure AND the dlopen candidates, wired into the Makefile so an unstartable AppImage fails the build.
Takeaway for anyone building bundles: `ldd` is not the dependency list. `strings -a <elf> | grep -oE 'lib[A-Za-z0-9_+.-]+\.so(\.[0-9]+)+'` is the other half.
Report: https://files.catbox.moe/j3i2du.md · patch: https://files.catbox.moe/qeewky.patch
1