在一次使用调试符号重新编译的错误尝试中ld
,我最终得到了一个未与 /lib 建立符号链接的 /lib64(Debian 64 位库位于 /lib/x84_64-linux-gnu 中)。我尝试使用 重新安装 libc6 apt
,但出现错误并抱怨上述问题。
我(错误地)认为我可以mv /lib64 /tmp && ln -s /lib /lib64
;第一个命令起作用了,但系统却坏了(/bin/ld not found
等等)。
有什么方法可以就地修复此问题吗?(即无需运行救援盘)
如果我可以匿名发布此文,我就会......[叹气]
答案1
不确定这是否会对部分问题有所帮助,但如果您发现您已经移动了运行时链接器,以至于 mv、cp、ln、rm 等不再起作用,您仍然可以通过明确指定运行时链接器来运行它们(并希望拯救自己)。例如
mv /lib64 /tmp ln -s /lib /lib64 # 失败,没有运行时链接器 /tmp/lib64/ld-2.13.so /bin/ln -s /lib /lib64 # 应该会成功
答案2
如果其他人遇到过这个问题;一旦我使用恢复光盘将文件放回原位,以下脚本允许我重新安装 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