当应用程序通过符号链接启动时,rpath是如何解决的



在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脚本

最新更新