从相对于加载可执行文件的目录加载 .so

Load .so from directory relative to loading executable

由于各种原因(主要是惯性),我们没有 make install 目标。

相反,我们将大型 C++ 代码库直接构建到类似 FHS 的树中;

output/
  bin/
  lib/
  etc/
  ...

我们最近将一些第三方库切换为动态链接,因此我们将一些 .so 库推送到 lib/

现在,我们习惯于从 bin/ 启动我们的可执行文件,但这不再有效,因为加载程序不搜索我们的 lib/ 目录。

LD_LIBRARY_PATH 会解决这个问题,但我们不希望在每次可执行文件调用之前都提供它,我们也不想将它放在 shell 的环境中,因为我们通常会在同一 shell.

中的多个不同构建树之间切换

我们考虑在生成的 ELF 中添加一个 rpath 条目,但相对路径通常根据 $PWD 解析,而不是可执行文件的目录名。

有没有办法让加载程序在 dirname(argv[0])/../lib 中查找 .so 库?

基本上,我知道有很多方法可以改变我们的习惯来完成这项工作(而且可能应该),但我们现在不想这样做,所以我们可以强制 Linux 所以loader 来做我们想做的事情?谢谢!

是的,可以使用 rpath${ORIGIN} 宏,它们在运行时被 ld.so 识别。

来自man ld.so

ld.so understands certain strings in an rpath specification 
(DT_RPATH or DT_RUNPATH); those strings are substituted as follows

$ORIGIN (or equivalently ${ORIGIN})
    This expands to the directory containing the application executable.

有更多变量可用。您不需要强制加载程序执行任何操作。它具有适合您的功能。 :)