为什么 /lib/libc.so.6 丢失了?

为什么 /lib/libc.so.6 丢失了?
find | grep libc.so.6

显示它在/lib/i386-linux-gnu/libc.so.6,但我运行的脚本希望它直接位于下/lib,那么为什么至少没有符号链接?

如果我在那里放置符号链接是否会有破坏任何东西的风险?

答案1

libc.so被作为多架构在 Ubuntu 11.04 中工作。那里不能有符号链接的原因是多架构的目的是可以同时安装i386amd64版本,libc以便您可以更轻松地在 64 位系统上运行 32 位二进制文​​件,反之亦然(以及其他类似情况)。如果软件包libc6包含指向新位置的符号链接,那么不同架构的软件包版本将无法同时安装(符号链接将dpkg选择哪个版本?),从而使整个练习失去意义。

从 Ubuntu 11.04 开始,任何对路径进行硬编码的内容都libc.so必须更新才能正常工作。如果您谈论的脚本是 Ubuntu 的一部分,请报告错误并添加标签multiarch

答案2

动态库由内核加载,路径不是硬编码在程序中的。程序只需说“我需要 libc.so.6”。然后系统会在 中定义的库路径中搜索/etc/ld.so.conf,默认包括/usr/lib和。此文件包括 中的其他配置文件。/lib/etc/ld.so.conf.d

在我的 64 位系统上,libc.so.6可以找到,/lib/x86_64-linux-gnu/libc.so.6因为在中定义了路径/etc/ld.so.conf.d/x86_64-linux-gnu.conf

# Multiarch support
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu

要找出程序加载了哪个库,请使用ldd如下方法ldd /bin/bash

    linux-vdso.so.1 =>  (0x00007ffff1dff000)
    libncurses.so.5 => /lib/libncurses.so.5 (0x00007f9d8b3b8000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f9d8b1b4000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9d8ae1f000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f9d8b61c000)

放置符号链接不会破坏任何东西。

要获取搜索的目录列表,请运行:

ldconfig -v -N | grep '^/'

-v显示文件+目录的列表,防止重新创建-N缓存( )。/etc/ld.so.cache

答案3

只需将符号链接添加到 libc.so.6 文件,如下所示:

sudo ln -s /lib/i386-linux-gnu/libc.so.6 /lib/libc.so.6

系统中其他丢失的文件也是如此,就我而言,Matlab 丢失了该文件,现在问题已经消失。

相关内容