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

Load .so from directory relative to loading executable

本文关键字:加载 so 可执行文件 相对于      更新时间:2023-10-16

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

相反,我们直接将大型c++代码库构建为类似fhs的树;

output/
  bin/
  lib/
  etc/
  ...

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

现在,我们习惯于能够从bin/启动可执行文件,但这不再工作,因为加载器不搜索我们的lib/目录。

LD_LIBRARY_PATH可以解决这个问题,但是我们不希望在每次可执行调用之前提供它,我们也不想把它粘在shell的环境中,因为我们通常在同一个shell中在许多不同的构建树之间切换。

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

是否有一种方法可以推动加载器在dirname(argv[0])/../lib中查找.so lib ?

基本上,我知道有很多方法可以改变我们的习惯,使它工作(也许应该),但我们不喜欢在这一点上,所以我们可以强迫Linux so加载器做我们想要的吗?谢谢!

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

From 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.

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

相关文章: