From 5979c8987f491a7011dfe796f2181c357bed74ed Mon Sep 17 00:00:00 2001 From: Dino Korah <691011+codemedic@users.noreply.github.com> Date: Thu, 7 May 2026 22:46:15 +0100 Subject: [PATCH] fix: strip .sframe from glibc crt objects to unblock Zig linker on GCC 15+ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GCC 15+ compiles glibc crt startup objects (crt1.o, Scrt1.o, rcrt1.o) with .sframe sections that use R_X86_64_PC64 relocations. Zig's self-hosted linker doesn't support this relocation type, causing build-time helpers such as ghostty-build-data to fail with: error: fatal linker error: unhandled relocation type R_X86_64_PC64 note: in /usr/lib/crt1.o:.sframe After pacman installs packages in setup-env.sh, use objcopy to strip .sframe and .rela.sframe from the affected objects. This is version-agnostic and requires no changes to the Zig invocation. Also remove URUNTIME_PRELOAD from bundle-appimage.sh — the aarch64 dwarfs-lite uruntime variant does not support the URUNTIME_MOUNT marker patching it requires, causing AppImage packaging to fail on aarch64. Fixes: https://github.com/pkgforge-dev/ghostty-appimage/issues/138 See: https://ziggit.dev/t/linker-error-when-building-zig-from-source/14394 --- bin/build-ghostty.sh | 2 +- bin/bundle-appimage.sh | 1 - bin/setup-env.sh | 8 ++++++++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/bin/build-ghostty.sh b/bin/build-ghostty.sh index 06f8abb..58a7db5 100755 --- a/bin/build-ghostty.sh +++ b/bin/build-ghostty.sh @@ -42,10 +42,10 @@ BUILD_ARGS="${BUILD_ARGS} -Dversion-string=${GHOSTTY_VERSION}" # Configure Zig: https://ziglang.org ZIG_VERSION="$(cat "ghostty-${GHOSTTY_VERSION}/build.zig.zon" | grep ".minimum_zig_version" | cut -d'"' -f2)" +ZIG_PACKAGE_NAME="zig-${ARCH}-linux-${ZIG_VERSION}" CURRENT_ZIG_VERSION=$(zig version 2>/dev/null || true) if [ "$CURRENT_ZIG_VERSION" != "$ZIG_VERSION" ]; then echo "Installing Zig ${ZIG_VERSION}..." - ZIG_PACKAGE_NAME="zig-${ARCH}-linux-${ZIG_VERSION}" ZIG_URL="https://ziglang.org/download/${ZIG_VERSION}/${ZIG_PACKAGE_NAME}.tar.xz" rm -rf /opt/zig* unlink /usr/local/bin/zig || true diff --git a/bin/bundle-appimage.sh b/bin/bundle-appimage.sh index 082f0c8..57f4d2e 100755 --- a/bin/bundle-appimage.sh +++ b/bin/bundle-appimage.sh @@ -6,7 +6,6 @@ ARCH="$(uname -m)" GHOSTTY_VERSION="$(cat VERSION)" export UPINFO="gh-releases-zsync|$(echo "${GITHUB_REPOSITORY}" | tr '/' '|')|latest|Ghostty-*$ARCH.AppImage.zsync" -export URUNTIME_PRELOAD=1 export DEPLOY_OPENGL=1 export EXEC_WRAPPER=1 export OUTNAME="Ghostty-${GHOSTTY_VERSION}-${ARCH}.AppImage" diff --git a/bin/setup-env.sh b/bin/setup-env.sh index c5afb6e..b909dcc 100755 --- a/bin/setup-env.sh +++ b/bin/setup-env.sh @@ -14,6 +14,14 @@ ghosttyDeps="gtk4 libadwaita gtk4-layer-shell" rm -rf "/usr/share/libalpm/hooks/package-cleanup.hook" pacman -Syuq --needed --noconfirm --noprogressbar ${buildDeps} ${ghosttyDeps} +# GCC 15+ compiles glibc crt startup objects with .sframe sections that use R_X86_64_PC64 +# relocations. Zig's self-hosted linker doesn't support this relocation type, causing +# build-time helpers (e.g. ghostty-build-data) to fail. Strip .sframe and its associated +# relocation section from the affected objects so the linker never encounters them. +for _crt in /usr/lib/crt1.o /usr/lib/Scrt1.o /usr/lib/rcrt1.o; do + [ -f "$_crt" ] && objcopy --remove-section .sframe --remove-section .rela.sframe "$_crt" +done + ARCH="$(uname -m)" MINISIGN_VERSION="$(get_latest_gh_release 'jedisct1/minisign')"