В ошибочной попытке перекомпилировать ld
с символами отладки я получил / lib64, который не был символически связан с / lib (64-разрядные библиотеки Debian находятся в / lib / x84_64-linux-gnu). Я попытался переустановить libc6, используя apt
, что привело к ошибкам при жалобе на вышеизложенное.
Я (ошибочно) решил, что могу просто mv /lib64 /tmp && ln -s /lib /lib64
; первая команда сработала, оставив сломанную систему (/bin/ld not found
и т.д.).
Есть ли способ исправить это на месте? (т.е. без запуска аварийного диска)
Если бы я мог опубликовать это анонимно, я бы ... [вздох]
Не уверен, что это помогло бы частично, но если вы когда-нибудь обнаружите, что переместили компоновщик времени выполнения, так что такие вещи, как mv, cp, ln, rm, больше не работают, вы все равно можете их запустить (и, надеюсь, спасти себя) путем явного указания компоновщика среды выполнения. Например.
mv /lib64 /tmp ln -s /lib /lib64 # fails, no runtime linker /tmp/lib64/ld-2.13.so /bin/ln -s /lib /lib64 # should succeed
Если у кого-нибудь еще есть эта проблема; Как только я использовал диск восстановления, чтобы вернуть файлы на место, следующий сценарий позволил мне переустановить libc:
#!/bin/bash
# Fix symlinks in a b0rked /lib64 (Debian).
# Libs in /lib64 should be symlinked to /lib/x86_64-linux-gnu;
# if a symlink is found in /lib64, try to redirect it to a
# file of the same name in /lib/x86_64-linux-gnu.
# Then remove the old symlink destination.
#
# The Problem:
# me@box # ls -l /lib64
# -rwxr-xr-x 1 root root 156683 2011-12-29 19:11 ld-2.13.so
# lrwxrwxrwx 1 root root 10 2011-12-29 19:11 ld-linux-x86-64.so.2 -> ld-2.13.so
#
# The Solution:
# lrwxrwxrwx 1 root root 10 2011-12-29 19:11 ld-linux-x86-64.so.2 -> /lib/x86_64-linux-gnu/ld-2.13.so
#
set -e
libs=(/lib64/*)
bak=$HOME
for l in ${libs[@]}; do
src=$(ls -l $l |awk '{print $10}');
if [[ ! -z "$src" ]]; then
if [[ ! -f "/lib64/$src" ]] || [[ ! -f "/lib/x86_64-linux-gnu/$src" ]]; then
echo "error: $l src or dest not found:"
echo `ls -l "/lib64/$src"` > /dev/null
echo `ls -l "/lib/x86_64-linux-gnu/$src"` > /dev/null
continue
fi
ln -si "/lib/x86_64-linux-gnu/$src" "$l";
mv "/lib64/$src" $bak/;
fi
done