为什么 /usr/lib64 不在 ld.so 的默认位置?

Why /usr/lib64 is not in the default location of ld.so?

昨天,我试图通过从源代码构建将我的 gcc 从 8.4.0 版本升级到 9.3.0,因为可以通过 Ubuntu 的 apt repo 安装的最新版本是 8.4.0。

构建和安装过程都可以,我可以编译任何c++代码,即使包括只有gcc-9.3.0实现的功能。 但是如果我在我的代码中使用 c++ STL,我不能 运行 我的程序。

通过“ldd my-program”,我找到了问题所在。 看起来 gcc-9.3.0 安装文件 libstdc++.so.6.0.28/usr/lib64/,而那个正式版(gcc-8.4.0)的(libstdc++.so.6.0.25)驻留在/usr/lib/x86_64-linux-gnu/,所以ld.so 无法为我的程序加载库。 如果我将“/usr/lib64”添加到 LD_LIBRARY_PATH env var 中,它会起作用。

奇怪 /usr/lib64 不是 Kubuntu-18.04.4LTS ld.so 的默认搜索位置之一,还是我错了?

我知道可以通过使用 LD_LIBRARY_PATH 或将路径添加到 /etc/ld.so.conf 来解决,我只是想知道 /usr/lib64 不是默认路径。

此外,我回顾了构建过程:

为了使目标尽可能接近来自 Ubuntu 的 apt repo 的官方目标, 在配置之前,我使用“echo | gcc -v -x c -E -”来获取官方 gcc-8.4.0 目标的所有构建选项, 然后将它们应用到我自己的建筑中,如下所示:

~/projects/gcc-9.3.0/configure \
--build=x86_64-linux-gnu \
--disable-libgcj \
--disable-libstdcxx-debug \
--disable-libunwind-exceptions \
--disable-multilib \
--disable-vtable-verify \
--enable-__cxa_atexit \
--enable-bootstrap \
--enable-checking=release \
--enable-clocale=gnu \
--enable-default-pie \
--enable-gnu-indirect-function \
--enable-gnu-unique-object \
--enable-initfini-array \
--enable-languages=c,c++ \
--enable-libmpx \
--enable-libstdcxx-time=yes \
--enable-linker-build-id \
--enable-nls \
--enable-offload-targets=nvptx-none \
--enable-plugin \
--enable-shared \
--enable-threads=posix \
--host=x86_64-linux-gnu \
--libdir=/usr/lib \
--libexecdir=/usr/lib \
--prefix=/usr \
--program-suffix=-9.3 \
--target=x86_64-linux-gnu \
--with-abi=m64 \
--with-bugurl=file:///usr/share/doc/gcc-8/README.Bugs \
--with-default-libstdcxx-abi=new \
--with-linker-hash-style=gnu \
--with-pkgversion='Ubuntu 9.3.0-6ubuntu1~18.04.4' \
--with-system-zlib \
--with-target-system-zlib \
--with-tune=generic \
--without-cuda-driver \
--without-included-gettext

请注意选项“--libdir=/usr/lib”明确设置目标库应安装到的路径。 但是文件libstdc++.so.6.0.28最终还是安装到了/usr/lib64。

我错过了什么?

我们将不胜感激任何帮助或提示!

并非所有 Debian/Ubuntu 多架构补丁都已集成到上游 GNU 工具链中。如果您想构建与系统其余部分兼容的工具链,则必须手动应用它们。请参阅 gcc-9 源码包中的 debian/patches/gcc-multiarch.diffdebian/patches/gcc-multilib-multiarch.diff

在动态加载器中使用 /usr/lib 而不是 /usr/lib64,除了多体系结构路径之外,还可以追溯到多体系结构之前的 Debian 端口(例如,Debian 6.0 squeeze ) 和原始的 amd64 端口。关于这个问题有一个非常古老的错误报告和邮件列表讨论:

当时似乎无法为即将发布的 Debian 版本修复此问题,之后卡住了。 (对不起,我不记得细节了。)