在Linux系统上使用rpath
设置和符号链接时遇到此问题。为了解释这个问题,我考虑以下设置:
我有一个名为foo
的应用程序,它依赖于libbar.so
。应用程序驻留在$ROOT/pkgs/foo-1.0/bin/
中,并符号链接到$ROOT/bin/
。图书馆libbar.so
住在$ROOT/lib/
。这给出了以下结构:
$ROOT/
bin/
foo --> $ROOT/pkgs/foo-1.0/bin/foo
lib/
libbar.so
pkgs/
foo-1.0/
bin/
foo
应用程序foo
现在(为了防止LD_LIBRARY_PATH设置)将rpath
设置为$ORIGIN/lib
。
现在的问题是,$ORIGIN/lib
是关于已解析的符号链接而不是关于调用应用程序的路径($ROOT/bin
)来解析的如何改变这一点
一个可能的解决方案是切换到硬链接,这在这种情况下是有效的,但我不能确保链接不指向文件系统边界,也不能确保文件系统支持硬链接。
现在的问题是
$ORIGIN/lib
在到解析的符号链接,而不是相对于从何处开始的路径该应用程序被称为($ROOT/bin
)如何这会改变吗
由于动态链接加载程序ld.so
解析运行时搜索路径的可执行文件不知道应用程序所在的符号链接的路径,因此您的特定问题的答案是:不可能
除此之外,nos在评论中提到了可行的解决方案:您需要将rpath设置为$ORIGIN/..//lib…,或者使$ROOT/bin/foo
成为设置LD_LIBRARY_PATH
的shell脚本