diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 924d0c2..2d4dfec 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -2,6 +2,27 @@ --- +## V44 2026-03-21 01:30:00 + +**Fix zlib chicken-and-egg: bootstrap host libz.so.1 into chroot before building** + +### Changes: +- Updated `023a-chroot-build-all.sh`: Before entering the chroot, copies the host + system's `libz.so.1` into `$LFS/usr/lib/`. This breaks the circular dependency: + ld needs libz.so.1 → can't link without it → can't build zlib without linking. + The temporary copy lets ld work, so zlib's configure tests pass, and the real + zlib build (024a-zlib.sh) replaces the temporary copy with a proper one. + +### Plan deviation/changes: +- None + +### What is missing/needs polish: +- The host-copied libz.so.1 is a temporary hack. It gets replaced by the real + zlib build immediately. If the host doesn't have zlib, the user needs to + install it first (pacman -S zlib on Arch). + +--- + ## V43 2026-03-21 01:15:00 **Add zlib build to chroot phase — ld needs libz.so.1 at runtime** diff --git a/toolchain/scripts/023a-chroot-build-all.sh b/toolchain/scripts/023a-chroot-build-all.sh index 792bca1..7252686 100644 --- a/toolchain/scripts/023a-chroot-build-all.sh +++ b/toolchain/scripts/023a-chroot-build-all.sh @@ -38,6 +38,30 @@ echo " DarkForge Linux — Chroot Build Phase (Chapter 7)" echo "============================================================" echo "" +# --- Bootstrap libz.so.1 from host ------------------------------------------- +# Chicken-and-egg problem: the linker (ld) from binutils pass 2 was built with +# zlib support and dynamically links against libz.so.1. But zlib isn't installed +# in the chroot yet. Without libz.so.1, ld can't run, so nothing can link, so +# we can't even build zlib properly. Fix: copy the host's libz into the chroot +# temporarily. The real zlib build (024a-zlib.sh) will replace it. +warn "Bootstrapping libz.so.1 from host into chroot..." +HOST_LIBZ=$(find /usr/lib /usr/lib64 /lib /lib64 -name 'libz.so.1*' -type f 2>/dev/null | head -1) +if [ -z "${HOST_LIBZ}" ]; then + # Try ldconfig cache + HOST_LIBZ=$(ldconfig -p 2>/dev/null | grep 'libz.so.1 ' | awk '{print $NF}' | head -1) +fi +if [ -n "${HOST_LIBZ}" ]; then + cp -Lv "${HOST_LIBZ}" "${LFS}/usr/lib/libz.so.1" + # Also create the .so symlink for the linker + ln -sfv libz.so.1 "${LFS}/usr/lib/libz.so" + ok "Copied host libz.so.1 → ${LFS}/usr/lib/libz.so.1" + ok "ld should now be able to link inside the chroot" +else + warn "Could not find host libz.so.1 — zlib build in chroot may fail" + warn "Install zlib on the host: sudo pacman -S zlib" +fi +echo "" + # Build a script that runs inside the chroot # We write it to a temp file inside $LFS so the chroot can see it cat > "${LFS}/tmp/chroot-build-runner.sh" << 'CHROOT_EOF'