← PaganLinux

Commit 6855af5

0
plików
+0
dodanych
-0
usuniętych
@@ -292,6 +292,25 @@ _is_true() {
292 292 esac
293 293 }
294 294
295 +# Czy adres (hex, np. z readelf/objdump) to dokładnie 0x9000 – link_addr jądra
296 +# GRUB-a i386-pc?
297 +#
298 +# Oba narzędzia piszą ten sam adres RÓŻNYMI formatami:
299 +# readelf -SW → „00009000” (zeruje pole Addr do szerokości ELF-a: 8 dla i386-pc)
300 +# objdump -f → „0x00009000” (z prefiksem 0x)
301 +# Dlatego najpierw zdejmujemy opcjonalny prefiks, a potem porównujemy LICZBOWO.
302 +#
303 +# DLACZEGO NIE PORÓWNANIE TEKSTOWE: `[[ "$a" == "9000" ]]` dawało FAŁSZYWY
304 +# ALARM („kernel.img is miscompiled”) dla całkowicie poprawnego pliku (bo
305 +# „00009000” != „9000”), a permissywny glob `!= *9000` przepuszczał realnie
306 +# zepsute 0x19000.
307 +_addr_is_0x9000() {
308 + local a="${1:-}"
309 + a="${a#0[xX]}"
310 + [[ "$a" =~ ^[0-9a-fA-F]+$ ]] || return 1
311 + (( 16#$a == 0x9000 ))
312 +}
313 +
295 314 clean_build_state() {
296 315 step "Tryb: zbuduj od nowa"
297 316
@@ -1930,7 +1949,7 @@ build_final_system() {
1930 1949 [[ -f "$PAGAN_ROOT/usr/lib/grub/i386-pc/kernel.exec" ]]; then
1931 1950 _gaddr=$(objdump -f "$PAGAN_ROOT/usr/lib/grub/i386-pc/kernel.exec" 2>/dev/null \
1932 1951 | awk '/start address/{print $NF}')
1933 - if [[ -n "$_gaddr" && "$_gaddr" != *9000 ]]; then
1952 + if [[ -n "$_gaddr" ]] && ! _addr_is_0x9000 "$_gaddr"; then
1934 1953 warn "GRUB i386-pc: kernel.exec start=$_gaddr (ma być 0x…9000) – usuwam z resume (przebudowa)"
1935 1954 sed -i '/^grub-2\.14$/d' "$RESUME_FILE" 2>/dev/null || true
1936 1955 fi
@@ -1963,7 +1982,7 @@ build_final_system() {
1963 1982 [[ -f "$PAGAN_ROOT/usr/lib/grub/i386-pc/kernel.img" ]]; then
1964 1983 _gaddr=$(readelf -SW "$PAGAN_ROOT/usr/lib/grub/i386-pc/kernel.img" 2>/dev/null \
1965 1984 | sed -n 's/^ *\[ *[0-9]*\] *\.text *[A-Z]* *\([0-9a-fA-F]*\).*/\1/p' | head -1)
1966 - if [[ -n "$_gaddr" && "$_gaddr" != *9000 ]]; then
1985 + if [[ -n "$_gaddr" ]] && ! _addr_is_0x9000 "$_gaddr"; then
1967 1986 warn "GRUB i386-pc: kernel.img .text na 0x$_gaddr (ma być 0x9000) – grub-install padnie"
1968 1987 if ! import_host_grub; then
1969 1988 warn "Brak gruba na hoście do importu – NIE przerywam builda: instalator użyje gruba z repo (netinstall → grub → grub-install). Uwaga: source-grub w ISO jest zepsuty – instalacja BIOS wymaga dostępu do repo."
@@ -1977,7 +1996,7 @@ build_final_system() {
1977 1996 [[ -f "$PAGAN_ROOT/usr/lib/grub/i386-pc/kernel.exec" ]]; then
1978 1997 _gexec=$(objdump -f "$PAGAN_ROOT/usr/lib/grub/i386-pc/kernel.exec" 2>/dev/null \
1979 1998 | awk '/start address/{print $NF}')
1980 - if [[ -n "$_gexec" && "$_gexec" != *9000 ]]; then
1999 + if [[ -n "$_gexec" ]] && ! _addr_is_0x9000 "$_gexec"; then
1981 2000 info " · grub: kernel.exec start=$_gexec (nieużywany przez grub-mkimage dla i386-pc – ignoruję)"
1982 2001 fi
1983 2002 fi
@@ -8823,11 +8842,17 @@ verify_rootfs() {
8823 8842 # czyta go readelf), a `kernel.exec` NIE jest używany przez grub-mkimage – jego
8824 8843 # adres 0x9074 (typowy po imporcie z dystrybucji) niczego nie psuje, więc go nie
8825 8844 # sprawdzamy. Test funkcjonalny: grub-mkimage -d <rootfs>/usr/lib/grub/i386-pc.
8845 + #
8846 + # PORÓWNANIE LICZBOWE (_addr_is_0x9000), nie tekstowe: readelf zeruje pole
8847 + # Addr do szerokości ELF-a, więc dla i386-pc wychodzi „00009000”. Wcześniejsze
8848 + # `== "9000"` dawało fałszywy „miscompiled” i wstrzymywało wydanie ISO mimo
8849 + # sprawnego GRUB-a (a wcześniejsza kontrola w fazie builda, glob `*9000`,
8850 + # raportowała wtedy OK – stąd sprzeczność w logach).
8826 8851 _grubimg="$PAGAN_ROOT/usr/lib/grub/i386-pc/kernel.img"
8827 8852 if [[ -f "$_grubimg" ]] && command -v readelf >/dev/null 2>&1; then
8828 8853 _gtext=$(readelf -SW "$_grubimg" 2>/dev/null \
8829 8854 | sed -n 's/^ *\[ *[0-9]*\] *\.text *[A-Z]* *\([0-9a-fA-F]*\).*/\1/p' | head -n1 || true)
8830 - if [[ "$_gtext" == "9000" ]]; then
8855 + if _addr_is_0x9000 "$_gtext"; then
8831 8856 ok "Boot: GRUB i386-pc kernel.img .text=0x9000 (instalacja na BIOS OK)"
8832 8857 else
8833 8858 crit "Boot: GRUB i386-pc kernel.img .text=0x${_gtext:-?} (ma być 0x9000) – instalacja na BIOS padnie (grub-mkimage: miscompiled)"