#!/bin/bash # ============================================================================= # fix-grub.sh – przebudowa GRUB 2.14 (i386-pc) po "kernel.img is miscompiled" # ----------------------------------------------------------------------------- # Problem: grub-install pada z: # kernel.img is miscompiled: its start address is 0x9074 instead of 0x9000 # Przyczyna: binutils >= 2.39 domyślnie linkuje z -z separate-code, co przesuwa # adres startowy kernel.img (musi być dokładnie 0x9000). Fix: TARGET_LDFLAGS z # -Wl,-z,noseparate-code przy BUILDZIE gruba (nie przy instalacji). # # Użycie: # sudo ./fix-grub.sh # a potem odśwież ISO: sudo ./respin-iso.sh none # ============================================================================= set -euo pipefail R="${PAGAN_ROOT:-/mnt/pagan}" [ "$(id -u)" = "0" ] || { echo "❌ Uruchom jako root: sudo ./fix-grub.sh"; exit 1; } ARCHIVE="$R/sources/grub-2.14.tar.xz" [ -f "$ARCHIVE" ] || { echo "❌ Brak archiwum: $ARCHIVE"; exit 1; } echo "=== Aktualny (zepsuty?) kernel.img ===" objdump -f "$R/usr/lib/grub/i386-pc/kernel.exec" 2>/dev/null | grep 'start address' || echo "(brak kernel.exec – przebudowa i tak potrzebna)" echo "=== Rozpakowuję grub-2.14 do $R/sources/build-grub-fix ===" B="$R/sources/build-grub-fix" rm -rf "$B" mkdir -p "$B" tar -xf "$ARCHIVE" -C "$B" --strip-components=1 cd "$B" mkdir -p build-pc cd build-pc echo "=== configure (--with-platform=pc + TARGET_LDFLAGS=-Wl,-z,noseparate-code) ===" env TARGET_LDFLAGS="-Wl,-z,noseparate-code" \ ../configure --prefix=/usr --sysconfdir=/etc \ --disable-werror --with-platform=pc # Workaround znany z buildera (brakujący cel w zależnościach make) touch grub-core/extra_deps.lst 2>/dev/null || true echo "=== make ===" make -j"$(nproc)" TARGET_LDFLAGS="-Wl,-z,noseparate-code" echo "=== make install DESTDIR=$R ===" make install DESTDIR="$R" cd / rm -rf "$B" echo "" echo "=== Weryfikacja (ma być: 0x...9000) ===" objdump -f "$R/usr/lib/grub/i386-pc/kernel.exec" | grep 'start address' ADDR=$(objdump -f "$R/usr/lib/grub/i386-pc/kernel.exec" 2>/dev/null | awk '/start address/{print $NF}' | sed 's/^0x//') case "$ADDR" in *9000) echo "✅ GRUB naprawiony. Teraz odśwież ISO: sudo ./respin-iso.sh none" ;; *) echo "❌ Adres startowy to $ADDR, nie ...9000 – fix nie zadziałał." echo " Wklej mi pełny log (ostatnie linie make), poszukamy dalej (np. LD=ld.bfd)." ;; esac