通过符号链接启动应用程序时,如何解析rpath

时间:2015-12-17 10:43:17

标签: linux shared-libraries symlink ld

我在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)。 如何更改?

一种可能的解决方案是切换到硬链接,在这种情况下可以工作,但我不能确保链接不是指向文件系统边界,也不是文件系统支持硬链接。

1 个答案:

答案 0 :(得分:1)

  

现在的问题是$ORIGIN/lib得到了尊重   到解决的符号链接而不是从哪里开始的路径   该应用程序被调用($ROOT/bin)。 怎么样?   这会改变吗?

由于动态链接加载程序ld.so解析运行时搜索路径的可执行文件不知道应用程序所在的符号链接路径,因此您的特定答案问题是:没办法。
除此之外,nos在他的评论中提到了可行的解决方案:你需要将rpath设置为$ ORIGIN /../../../ lib ...,或者使$ROOT/bin/foo成为一个shell脚本设置LD_LIBRARY_PATH