Сломался /lib64, можно? (Убунт /mint12)

В ошибочной попытке перекомпилировать ld с символами отладки я получил /lib64, который не был связан с /lib (64-битные библиотеки Debian находятся в /lib/x84_64-linux-gnu). Я попытался переустановить libc6, используя apt, который допустил ошибку с жалобой на вышесказанное.

Я (по ошибке) подумал, что я мог бы просто mv /lib64 /tmp && ln -s /lib /lib64; первая команда сработала, оставив сломанную систему (/bin/ld not found так далее.).

Есть ли способ исправить это на месте? (т.е. без запуска аварийного диска)

Если бы я мог опубликовать это анонимно, я бы... [вздох]

2 ответа

Решение

Не уверен, что это помогло бы с его частью, но если вы когда-нибудь обнаружите, что переместили компоновщик среды выполнения, чтобы такие вещи, как mv, cp, ln, rm больше не работали, вы все равно можете их запустить (и, надеюсь, спасти себя) явно указав компоновщик времени выполнения. Например

    mv /lib64 /tmp
    ln -s /lib /lib64   # терпит неудачу, нет компоновщика во время выполнения
    /tmp/lib64/ld-2.13.so /bin/ln -s /lib /lib64    # должен быть успешным

Если кто-то еще имеет эту проблему; как только я использовал диск восстановления, чтобы вернуть файлы туда, где они были, следующий скрипт позволил мне переустановить 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
Другие вопросы по тегам