在 Debian(64 位)上,如何安装从源代码构建的 glibc?

在 Debian(64 位)上,如何安装从源代码构建的 glibc?

当我尝试这样做时,我的系统崩溃了,每个程序都立即出现段错误。我相信这是因为它安装了新版本的ld-linux-x86-64.so.2in,/lib64但是当加载程序时,它会找到旧版本的libc.so.6in/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)。

这就是我所做的:

  1. /lib我备份了、/lib32、 和的内容/lib64

  2. 我编辑/etc/ld.so.conf.d/x86_64-linux-gnu.conf为放置/lib64在搜索路径的顶部。

  3. 我使用选项配置了新版本的 glibc (2.19),--prefix=/usr --enable-kernel=2.6.26以匹配旧的 glibc 版本 (2.13)。

  4. 我构建了新的 glibc。这事平安无事。

  5. 我曾经su获得 root 权限,并运行make install.它开始安装,然后在ld-linux-x86-64.so.2安装新版本后出现段错误,并且仍在拾取旧版本libc.so.6

  6. 为了解决这个问题,我运行了ldconfig(当然仍然是 root 身份)。

  7. 我重新启动安装 ( make install)。它在调用某些命令时再次出错gcc。我发现这是因为标头不匹配:新版本/usr/include/stdio.h在 处采用旧/usr/include/x86_64-linux-gnu/sys/cdefs.h版本而不是新版本/usr/include/sys/cdefs.h

  8. 因此,为了解决这个问题,我删除了目录/usr/include/x86_64-linux-gnu/sys,并将其替换为/usr/include/sys.我还将标头a.out.hfpu_control.hieee754.hin替换/usr/include/x86_64-linux-gnu为 中新版本的符号链接/usr/include

  9. 我再次重新启动安装(make install)。终于成功了。

重新启动系统后,一切都处于完美的工作状态。

我还没有弄清楚如果我尝试更新与系统上的 64 位版本一起安装的 32 位版本的 libc,会发生什么情况。我怀疑它会再次可怕地破坏一切。如果我成功,将更新这个答案。

相关内容