find | grep libc.so.6
显示它在/lib/i386-linux-gnu/libc.so.6
,但我运行的脚本希望它直接位于下/lib
,那么为什么至少没有符号链接?
如果我在那里放置符号链接是否会有破坏任何东西的风险?
答案1
libc.so
被作为多架构在 Ubuntu 11.04 中工作。那里不能有符号链接的原因是多架构的目的是可以同时安装i386
和amd64
版本,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 丢失了该文件,现在问题已经消失。