我在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
)。 如何更改?
一种可能的解决方案是切换到硬链接,在这种情况下可以工作,但我不能确保链接不是指向文件系统边界,也不是文件系统支持硬链接。
答案 0 :(得分:1)
现在的问题是
$ORIGIN/lib
得到了尊重 到解决的符号链接而不是从哪里开始的路径 该应用程序被调用($ROOT/bin
)。 怎么样? 这会改变吗?
由于动态链接加载程序ld.so
解析运行时搜索路径的可执行文件不知道应用程序所在的符号链接路径,因此您的特定答案问题是:没办法。
除此之外,nos在他的评论中提到了可行的解决方案:你需要将rpath设置为$ ORIGIN /../../../ lib ...,或者使$ROOT/bin/foo
成为一个shell脚本设置LD_LIBRARY_PATH
。