在 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
——这在我们的环境中不是一个问题,我不想听到关于它的评论。