66 lines
2.2 KiB
Bash
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"
|