为什么 ubuntu 会重复目标文件以及如何找到包所拥有的正确文件,而不依赖黑客来改变 LD_LIBRARY_PATH?
来自 Ubuntu 20.04 的一个简单示例:
> docker run -it --rm ubuntu:20.04
...
# ldd /usr/bin/apt
...
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f7eded19000)
...
# dpkg-query --search /lib/x86_64-linux-gnu/libstdc++.so.6
dpkg-query: no path found matching pattern /lib/x86_64-linux-gnu/libstdc++.so.6
# dpkg-query --search /usr/lib/x86_64-linux-gnu/libstdc++.so.6
libstdc++6:amd64: /usr/lib/x86_64-linux-gnu/libstdc++.so.6
我正在查看链接到 apt 的目标文件,其中 libstdc++.so.6 就是其中之一。libstdc++6 包拥有/usr/lib/x86_64-linux-gnu/libstdc++.so.6
。但是:
ldd
查找目标文件的顺序/lib
在之前指定/usr/lib
- 目标文件存在
/lib
于/usr/lib
- 包所拥有的文件在顺序中位于较后位置
这最终导致加载的目标文件不是提供该文件的包所拥有的文件。
我已验证 debian 没有重复的目标文件(或至少没有 libstdc++6)。为什么它们存在?有没有办法忽略它们?
答案1
首先出于兼容性原因,有一个结构,但现在 lib 只是符号链接到 /usr/lib
也可以看看