当我尝试这样做时,我的系统崩溃了,每个程序都立即出现段错误。我相信这是因为它安装了新版本的ld-linux-x86-64.so.2
in,/lib64
但是当加载程序时,它会找到旧版本的libc.so.6
in/lib/x86_64-linux-gnu
而不是新版本的/lib64
。 (显然 ld 和 libc 必须匹配?)
我尝试将其放在/lib64
顶部/etc/ld.so.conf.d/x86_64-linux-gnu.conf
然后运行ldconfig
。然而,由于某种原因,这并没有解决任何问题。
答案1
在搜索不相关的内容时,我偶然发现了为什么我的安装会选择旧的 libc:因为新的 libc 有一个旧的 ABI 版本(https://stackoverflow.com/questions/20577638/library-path-order-for-alternate-glibc-dynamic-linker-ld-so)。
这就是我所做的:
/lib
我备份了、/lib32
、 和的内容/lib64
。我编辑
/etc/ld.so.conf.d/x86_64-linux-gnu.conf
为放置/lib64
在搜索路径的顶部。我使用选项配置了新版本的 glibc (2.19),
--prefix=/usr --enable-kernel=2.6.26
以匹配旧的 glibc 版本 (2.13)。我构建了新的 glibc。这事平安无事。
我曾经
su
获得 root 权限,并运行make install
.它开始安装,然后在ld-linux-x86-64.so.2
安装新版本后出现段错误,并且仍在拾取旧版本libc.so.6
。为了解决这个问题,我运行了
ldconfig
(当然仍然是 root 身份)。我重新启动安装 (
make install
)。它在调用某些命令时再次出错gcc
。我发现这是因为标头不匹配:新版本/usr/include/stdio.h
在 处采用旧/usr/include/x86_64-linux-gnu/sys/cdefs.h
版本而不是新版本/usr/include/sys/cdefs.h
。因此,为了解决这个问题,我删除了目录
/usr/include/x86_64-linux-gnu/sys
,并将其替换为/usr/include/sys
.我还将标头a.out.h
、fpu_control.h
和ieee754.h
in替换/usr/include/x86_64-linux-gnu
为 中新版本的符号链接/usr/include
。我再次重新启动安装(
make install
)。终于成功了。
重新启动系统后,一切都处于完美的工作状态。
我还没有弄清楚如果我尝试更新与系统上的 64 位版本一起安装的 32 位版本的 libc,会发生什么情况。我怀疑它会再次可怕地破坏一切。如果我成功,将更新这个答案。