#!/bin/bash # Eksperyment: która flaga linkowania GRUB-a daje kernel.exec .text = 0x9000? # Bierze DOKŁADNĄ komendę linkowania z logu budowy i relinkuje warianty. set -u cd /tmp/gb/grub-core || exit 1 CMD=$(grep -n "kernel_exec-startup.o" /tmp/gb-make.log | tail -1 | sed 's/^[0-9]*://') echo "długość komendy: ${#CMD} znaków" [ -n "$CMD" ] || { echo "nie znalazłem komendy linkowania"; exit 1; } wariant() { local _name="$1" _sed="$2" local _cmd _cmd=$(printf '%s' "$CMD" | sed "$_sed") # podmiana pliku wyjściowego, żeby nie nadpisać bazowego _cmd=$(printf '%s' "$_cmd" | sed "s/-o kernel\.exec/-o kernel.$_name.exec/") if eval "$_cmd" > /tmp/link-$_name.log 2>&1; then local _t _t=$(readelf -SW kernel.$_name.exec 2>/dev/null \ | sed -n 's/^ *\[ *[0-9]*\] *\.text *[A-Z]* *\([0-9a-fA-F]*\).*/\1/p' | head -1) printf ' %-28s .text = 0x%s\n' "$_name" "${_t:-?}" else printf ' %-28s LINK BŁĄD (patrz /tmp/link-%s.log)\n' "$_name" "$_name" tail -2 /tmp/link-$_name.log | sed 's/^/ /' fi } echo "=== warianty ===" wariant baseline 's/^gcc //' wariant bez_noseparate 's/ -Wl,-z,noseparate-code//' wariant bez_N 's/ -Wl,-N//g' wariant Ttext_zamiast_imgbase 's/ -Wl,--image-base,0x9000/ -Wl,-Ttext,0x9000/' wariant bez_noseparate_Ttext 's/ -Wl,-z,noseparate-code//; s/ -Wl,--image-base,0x9000/ -Wl,-Ttext,0x9000/' wariant bez_buildid 's/ -Wl,--build-id=none//'