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

时间:2015-10-13 19:00:46

标签: c++ linux shared-libraries

由于各种原因主要与惯性有关,我们没有- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 目标。

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

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer

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

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

bin/可以解决这个问题,但我们不希望在每次单个可执行调用之前都提供它,并且我们不想将它粘在shell的环境中,因为我们通常会在不同的构建树在同一个shell中。

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

有没有办法轻推加载器查找rpath .so libs?

基本上,我知道有很多方法可以改变我们的习惯来使这项工作(可能应该),但我们不想在这一点上,所以我们可以强迫Linux这样的加载器来做我们想做的事情?谢谢!

1 个答案:

答案 0 :(得分:2)

是的,可以使用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.

有更多变量可供选择。您不需要强制加载任何东西。它有你的功能。 :)