🔒 Repository is read-only – file editing is disabled.

PaganLinux/fix-grub.sh main

63 linii Raw ← Powrót
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
#!/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