为什么缺少/lib/libc.so.6?

find | grep libc.so.6 

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

如果我在那里放一个符号链接,我会冒险破坏任何东西吗?

libc.so在Ubuntu 11.04中作为multiarch工作的一部分被移动了。 不存在符号链接的原因是multiarch的目的是使得同时安装i386amd64版本的libc成为可能,这样你就可以更容易地在64-上运行32位二进制文​​件比特系统,反之亦然(和其他类似的情况)。 如果libc6包中包含新位置的符号链接,那么不同架构的那个包的版本不能同时安装(符号链接的哪个版本会被dpkg选中?),从而打败了整个练习点。

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

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

在我的64位系统上,由于/etc/ld.so.conf.d/x86_64-linux-gnu.conf定义的路径,可以在/lib/x86_64-linux-gnu/libc.so.6找到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 

要找出程序加载的库,请使用lddldd /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 )。

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

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

对于仍在系统上的其他丢失文件也是如此,在我的情况下,Matlab错过了文件,问题现在已经消失。