在Solaris中,我将以下内容链接起来(使用Sun Studio;它使用Solaris链接器,而不是GNU):
CC -shared (other flags) -R'$ORIGIN/../lib/' -o /buildpath/lib/libmylib1.so
CC -shared (other flags) -R'$ORIGIN/../lib/' -lmylib1 -o /buildpath/lib/libmylib2.so
CC (various flags) -R'$ORIGIN/../lib/' -lmylib2 -o /buildpath/bin/somebinary
...它将最终的二进制文件链接就好了。
当我尝试在Linux中使用GNU ld
(再次使用Sun Studio作为编译器驱动程序)时,共享对象链接正常,但somebinary
无法链接,因为找不到libmylib1的.so。
当我通过strace运行第3行时,它会尝试打开一个文件,其路径中包含文字(未展开)字符串$ORIGIN
。
我遇到了一些涉及这个主题的其他问题。我见过的唯一解决方法是使用相对路径,但这需要您从固定位置执行二进制文件 - 也就是说,它相对于`pwd`
而不是二进制文件的位置进行检查。
在任何人发表关于$ORIGIN
不安全/不安全的通常评论之前 - 这在我们的环境中并不是一个问题,我不想听到有关它的评论。
答案 0 :(得分:2)
看起来我必须这样做,虽然我不确定这可能有什么副作用,因为我不熟悉-rpath-link
标志:
CC -shared (other flags) -R'$ORIGIN/../lib/' -o /buildpath/lib/libmylib1.so
CC -shared (other flags) -R'$ORIGIN/../lib/' -lmylib1 -o /buildpath/lib/libmylib2.so
CC (various flags) -R'$ORIGIN/../lib/' -Wl,-rpath-link,/buildpath/lib/ -lmylib2 -o /buildpath/bin/somebinary
通过我做的几个测试,我学到了以下内容:
$ORIGIN
根本不会被GNU ld
扩展,无论是-rpath
还是-rpath-link
标志
ld.so
会很好地扩展-rpath-link
是在-rpath
,DT_*PATH
,LD_*_PATH
等之前搜索到的第一组路径。