glibc 预配置错误:libc 不应安装在 /usr/local 中

glibc 预配置错误:libc 不应安装在 /usr/local 中
.
.
.
checking for kernel header at least 3.2.0... ok
*** On GNU/Linux systems the GNU C Library should not be installed into
*** /usr/local since this might make your system totally unusable.
*** We strongly advise to use a different prefix.  For details read the FAQ.
*** If you really mean to do this, run configure again using the extra
*** parameter `--disable-sanity-checks'.
Pre-configuration commands finished with code: 1

我想看一些 c 代码,所以我只是克隆了 glibc,在 clion 中打开它,然后出现了这个错误。

  1. 我该如何在我的系统:debian 上构建它?
  2. Debian 为什么要做这样的事情?

答案1

  1. Debian 为什么要做这样的事情?

/usr/local/lib这不是由 Debian 引起的,而是由大多数 Linux 系统上 C 编译器和动态链接器/加载器的配置方式引起的:如果和中存在同名的库/usr/lib,则 中的库/usr/local/lib优先。

这使得系统管理员可以轻松地用自定义库替换系统上的任何库,并让自定义库在包更新时保留下来。

然而,除非您真的知道自己在做什么,否则用自定义安装替换已安装的安装glibc并不是一个好主意:它几乎影响系统上的每个命令和程序,包括用于安装新版本的工具glibc

来自glibc 常见问题 wiki 页面:

为什么 glibc 永远不会安装在 GNU/Linux 系统的 /usr/local 中?

GNU C 编译器会以一种特殊的方式处理/usr/local/include这些/usr/local/lib目录,然后再搜索系统目录。由于在 GNU/Linux 上/usr/include,系统目录/usr/lib包含可能不同的 glibc 版本,并且不支持混合来自不同 glibc 安装的某些文件,并且会损坏,因此您有损坏整个系统的风险。

如果要测试 glibc 安装,则必须安装到不同的目录DESTDIR(不要--prefix用其他值覆盖,因为只--prefix=/usr允许)。

如何安装我刚刚构建的所有 GNU C Library 项目库?

安装这些库的唯一正确的方法是首先将它们安装到临时目录中,例如/tmp/glibcvia make install DESTDIR=/tmp/glibc,然后将该目录复制到初始根磁盘中,引导初始根磁盘,并将结果复制到根文件系统,然后进行透视进入根文件系统作为引导的最后一步。那就是仅有的今天安装 glibc 的安全方法。

但请注意,没有任何发行版会这样做。他们不这样做是因为这样做会要求安装 glibc 后重新启动,目前仅当您希望所有运行的进程在安全更新后重新加载 glibc 时才需要(因为已运行的进程仍将运行旧库)。相反,发行版使用包管理器来解压库的存档并将它们安装到正在运行的系统中。这实际上是相当危险的,因为在某个时间点,您的系统上将拥有库的混合副本,有些是新的,有些是旧的,这可能会导致在这么小的时间窗口内,所有新执行的进程无法启动。以类似的方式,在升级过程中,包含语言区域设置的本地化存档将被重建,在此期间,如果缺少所需的本地化语言(尚未重建到存档中),进程可能无法启动。即使是包管理系统也不能幸免,例如 rpm 必须采取措施在安装 glibc 时不执行新进程,而是使用内置的 lua 解释器来运行脚本,以允许 rpm 使用库的旧副本作为内聚体运行整个,同时安装新副本。

总之,安装 glibc 的最佳方法是将其从另一个系统安装到您正在使用的磁盘中,通常这可以在初始根磁盘中完成,下一个最佳方法是通过静态或精心设计的应用程序来复制新文件就位,而不会尝试通过不完整的部分安装执行新进程。选择其中之一。最终,后者将在共享运行时的重负载系统上变得无法支持。


  1. 我该如何在我的系统:debian 上构建它?

就像常见问题解答所说的那样,DESTDIR环境变量。在开始之前执行此操作,这样 glibc./configure脚本中的安全检查就不会触发。

构建完成后,您可以通过将LD_LIBRARY_PATH环境变量设置为指向来对其进行一些测试$DESTDIR/lib。但如上所述,它可能会导致与属于 Debian 标准版本 glibc 的其他文件发生冲突。

测试新 glibc 的更好方法是准备一个虚拟机,然后将其磁盘挂载到主机系统(虚拟机已停止),这样您就可以在需要运行任何组件之前将新 glibc 的所有组件安装到虚拟机上。并冒着不兼容的风险。然后您可以启动虚拟机并查看会发生什么。

如果虚拟机仍然可以工作并且新的 glibc 通过了您当时想要进行的任何测试,只有那时您可以开始考虑将新的 glibc 安装到您的主机系统上。为此,您需要仔细计划:您会从外部媒体启动来安装新的 glibc 吗?或者您会将新的 glibc 打包到一个(一组)*.deb包中,并使用包管理器来安装它?无论哪种方式,请额外确保您的备份是最新的您手头有启动媒体在你开始之前。

如果您决定使用打包路线,那么我强烈建议您首先加载您发行版的标准版本 glibc 的源代码包,并仔细研究打包和包含的任何安装前/安装后脚本:即使使用包管理器,也可以有特定的内容。流程中必须执行的步骤非常正确

答案2

您需要传递--prefix=<some other directory>configure脚本。它将确保文件安装在<some other directory>[0] 中。

安装不兼容版本的glibcin/usr/local可能会使您的系统无法使用。

要编译,glibc请转到源树的根目录并

cd build
../configure --prefix=<some other directory> # /tmp/compileGlibc
make -j$(nproc)

这应该建立glibc.和跑步

make install

将安装文件到<some other directory>.

您也可以通过传递给脚本来glibc使用默认编译。PREFIX--disable-sanity-checksconfigure

[0]https://sourceware.org/git/?p=glibc.git;a=blob;f=安装;h=b29916e748c25a25888125ee3d162050d6339181;hb=HEAD

相关内容