【问题标题】:Why /usr/lib64 is not in the default location of ld.so?为什么 /usr/lib64 不在 ld.so 的默认位置?
【发布时间】:2020-04-14 10:25:06
【问题描述】:

昨天,我尝试通过从源代码构建将我的 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/ 中,而那个 (libstdc++.so .6.0.25) 正式版(gcc-8.4.0) 驻留在/usr/lib/x86_64-linux-gnu/,所以ld.so不能加载libs我的程序。 如果我将“/usr/lib64”添加到 LD_LIBRARY_PATH 环境变量中,它可以工作。

奇怪的是 /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 下。

我错过了什么?

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

【问题讨论】:

    标签: gcc build ubuntu-18.04 ldd gcc9


    【解决方案1】:

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

    在动态加载器中使用/usr/lib 代替/usr/lib64,除了多架构路径之外,还可以回到多架构之前的Debian 端口(例如,Debian 6.0 挤压)和原始的amd64 端口.关于这个问题,有一个非常古老的错误报告和邮件列表讨论:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-29
      • 1970-01-01
      • 1970-01-01
      • 2017-01-18
      • 2017-12-26
      • 1970-01-01
      • 2014-03-10
      • 1970-01-01
      相关资源
      最近更新 更多