1

在 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

...它链接最终的二进制文件就好了。

当我尝试在带有 GNU 的 Linux 中执行此操作时ld(再次使用 Sun Studio 作为编译器驱动程序),共享对象链接正常,但somebinary无法链接,因为它找不到 libmylib1.so。

当我通过 strace 运行第三行时,它会尝试打开一个文件,其路径中包含文字(未扩展)字符串$ORIGIN

我遇到了许多其他关于这个主题的问题。我见过的唯一解决方法是使用相对路径,但这需要您从固定位置执行二进制文件——也就是说,它检查相对于`pwd`而不是二进制文件的位置。

在任何人加入关于不安全/不安全的通常评论之前$ORIGIN——这在我们的环境中不是一个问题,我不想听到关于它的评论。

4

1 回答 1

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

通过我所做的一些测试,我学到了以下内容:

  • $ORIGINGNU 根本没有扩展ld,无论是 in-rpath还是-rpath-linkflags
    • ld.so会很好地扩展它
  • -rpath-link-rpath是在、DT_*PATHLD_*_PATH等之前搜索的第一组路径。
于 2012-07-03T19:17:35.523 回答