Files
Deshab-OS/CODE/linux/tmp_restore_persist_ld.sh
T

66 lines
2.2 KiB
Bash

#!/usr/bin/env bash
# Restore persist ld.so/libc from the native extra copy (objcopy left
# zero-size GNU_PROPERTY headers). Then re-inject session + helper.
set -uo pipefail
ROOT=/mnt/d/Code/DEAICUP/Deshab
OUT="$ROOT/.build_tmp/restore_persist_ld.out"
exec > >(stdbuf -oL tee "$OUT") 2>&1
killall qemu-system-x86_64 2>/dev/null || true
WANT_LD=1e794eb14f4bccf6186bf8d9aa2018e8963ea668
WANT_LIBC=503200d7fda94a5dc6058d7e0694e5d1dcb2e372
SRC=""
S=""
for p in /home/deshab/linux-extra-rootfs.img /root/extra_rootfs_work/extra-rootfs.img; do
[[ -f "$p" ]] || continue
echo "[restore] candidate $p"
t=$(mktemp -d)
if ! mount -o loop,ro "$p" "$t"; then
rmdir "$t"
continue
fi
bid=$(readelf -n "$t/usr/lib/ld-linux-x86-64.so.2" 2>/dev/null | awk '/Build ID:/ {print $3; exit}')
echo "[restore] $p ld.so buildid=$bid"
readelf -l "$t/usr/lib/ld-linux-x86-64.so.2" 2>/dev/null | grep -A1 GNU_PROPERTY || true
if [[ "$bid" == "$WANT_LD" ]]; then
SRC="$p"
S="$t"
break
fi
umount "$t"
rmdir "$t"
done
if [[ -z "$SRC" ]]; then
echo "[restore] no matching native extra copy (want $WANT_LD)"
exit 1
fi
echo "[restore] src $SRC"
IMG=/home/deshab/deshab-dev.img
LOOP=$(losetup --find --show --partscan "$IMG")
sleep 0.3
M=$(mktemp -d)
mount "${LOOP}p1" "$M"
E=$(mktemp -d)
mount -o loop "$M/boot/linux-extra-rootfs.img" "$E"
echo "[restore] dst before"
readelf -l "$E/usr/lib/ld-linux-x86-64.so.2" 2>&1 | grep -A1 GNU_PROPERTY || true
cp -a "$S/usr/lib/ld-linux-x86-64.so.2" "$E/usr/lib/ld-linux-x86-64.so.2"
# libc.so.6 may be a symlink to libc.so.6 real file
src_libc=$(readlink -f "$S/usr/lib/libc.so.6")
dst_libc=$(readlink -f "$E/usr/lib/libc.so.6")
echo "[restore] libc $src_libc -> $dst_libc"
cp -a "$src_libc" "$dst_libc"
chmod 0755 "$E/usr/lib/ld-linux-x86-64.so.2" "$dst_libc"
echo "[restore] dst after"
readelf -l "$E/usr/lib/ld-linux-x86-64.so.2" 2>&1 | grep -A2 GNU_PROPERTY || true
readelf -n "$E/usr/lib/ld-linux-x86-64.so.2" 2>&1 | grep -i 'x86 feature\|SHSTK\|IBT\|GNU_PROPERTY' || true
umount "$E"
rmdir "$E"
umount "$M"
losetup -d "$LOOP"
rmdir "$M"
umount "$S"
rmdir "$S"
echo "[restore] extra ld.so restored"