GNU ld无法正确处理ORIGIN处理;有解决方法吗?

时间:2012-07-03 17:23:52

标签: linker gnu ld

在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不安全/不安全的通常评论之前 - 这在我们的环境中并不是一个问题,我不想听到有关它的评论。

1 个答案:

答案 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是在-rpathDT_*PATHLD_*_PATH等之前搜索到的第一组路径。