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)"