Unix 二进制文件如何决定从哪里获取共享库?

Unix 二进制文件如何决定从哪里获取共享库?

我使用 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(确保您的路径是最先在该列表中,它们按顺序被搜索)通过使用执行该操作的运行脚本

相关内容