Ubuntu中临时库搜索路径

3
我有同一个库的多个版本,我的程序会动态链接到其中一个版本。有时我想更改使用的版本。
我看到新版Ubuntu因安全原因不再支持LD_LIBRARY_PATH。我可以将路径添加到/etc/ld.so.conf中并运行ldconfig,但我不总是拥有系统管理员权限。
有人知道如何更改库搜索路径,让普通用户也能够做到吗?请假设这种情况经常发生,更新配置文件是最后的选择。
编辑:这是我的测试方式以及预期结果等:我在程序上运行ldd,看到libfoo.so => /some/path/to/lib/libfoo.so。我在LD_LIBRARY_PATH之前加入/path/to/different/version/lib(其中包含名为libfoo.so的文件),然后重新运行ldd。libfoo.so的路径与之前相同,而我希望看到libfoo.so => /path/to/different/version/lib/libfoo.so
谢谢,
Andrew
1个回答

7
您可以使用patchelf来修改任何可执行文件的RPATH(库搜索路径)。它是一个很棒的工具,而且不需要特殊权限即可运行。要将程序设置为首先搜索/opt/my-libs/lib,然后是/foo/lib,只需执行以下操作:
% patchelf --set-rpath /opt/my-libs/lib:/foo/lib program

我正在从源代码构建可执行文件,因此如果需要,我可以更改编译/链接选项。RPATH是否基于编译时的-L选项?有一个-Wl,-R/path/to/lib,我不理解它的含义。只是为了明确,根据文档,我正在尝试的操作应该是有效的,对吗? - ajwood
似乎应该有一种方法可以为程序设置默认值,但如果用户愿意的话,在运行时可以覆盖它。 - ajwood
使用RPATH链接(如所述)将硬编码库搜索路径为所需。主要问题是更改它,您可以通过重新链接或使用patchelf来完成。 - EmeryBerger
我对LD_LIBRARY_PATH的有用性感到困惑。只有在链接时没有指定RPATH时,才会搜索其中的路径? - ajwood
2
根据维基百科(http://en.wikipedia.org/wiki/Rpath_(linking)),“使用RPATH的主要缺点是它的优先级高于LD_LIBRARY_PATH设置。” - EmeryBerger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接