Назад | Перейти на главную страницу

Сломался / lib64, можно восстановить? (ubuntu / mint12)

В ошибочной попытке перекомпилировать 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