![Unix 二进制文件如何决定从哪里获取共享库?](https://linux22.com/image/1356229/Unix%20%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%96%87%E4%BB%B6%E5%A6%82%E4%BD%95%E5%86%B3%E5%AE%9A%E4%BB%8E%E5%93%AA%E9%87%8C%E8%8E%B7%E5%8F%96%E5%85%B1%E4%BA%AB%E5%BA%93%EF%BC%9F.png)
我使用 Linux 可执行文件,库位于许多地方。我的意思是同一个库,但版本不同。问题是可执行文件选择了错误库中的可执行文件。操作系统是 Ubuntu 64 位。
这些库位于 /usr/local/lib 和 /usr/lib/x86_64-linux-gnu。我希望它使用 /usr/local/lib 版本。
强制它使用 /usr/local/lib 版本。我将 .so 从那里复制到 /usr/lib/x86_64-linux-gnu 并删除那里引用的 .so。结果是软件 (VLC) 没有使用新复制的库,但它停止正常工作,并且根本找不到该库。尽管事实如此,它在那里。因此不清楚 VLC 如何决定使用哪个库。
很明显,它使用 /etc/ld.so.conf.d 下的文件来获取库路径。(文件包含 /usr/local/lib 和 /usr/lib/x86_64-linux-gnu)为什么它不选择我在 /usr/lib/x86_64-linux-gnu 或 /usr/local/lib 下复制的库?
未设置 LD_LIBRARY_PATH。
更新:
我以为我可以添加另一个版本,程序会使用该版本,但似乎库的版本是在编译时为给定的可执行文件设置的。所以它不会使用新版本,只是因为我删除了一个旧版本。
答案1
实现这一目标的两种方法
a) 在链接时设置rpath
- 这是一种非常丑陋且不可移植的方式,应尽可能避免
b)使用LD_LIBRARY_PATH
环境变量(如果更改它,请不要忘记导出它!)
如果你想为你的二进制文件使用特定的版本/修改/foo-reason,我建议
a) 如果许可证允许,则静态链接
b)LD_PRELOAD
按照这里解释的方式使用https://stackoverflow.com/questions/426230/what-is-the-ld-preload-trick
c)修改LD_LIBRARY_PATH
(确保您的路径是最先在该列表中,它们按顺序被搜索)通过使用执行该操作的运行脚本