从相对于加载可执行文件的目录加载 .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.
有更多变量可用。您不需要强制加载程序执行任何操作。它具有适合您的功能。 :)
由于各种原因(主要是惯性),我们没有 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.
有更多变量可用。您不需要强制加载程序执行任何操作。它具有适合您的功能。 :)