GNU ld不能正确处理ORIGIN处理; 有没有解决方法?
在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运行第三行时,它试图打开一个文件,其路径中包含文字(未扩展)的字符串$ORIGIN
。
我遇到了一些涉及此主题的其他问题。 我见过的唯一解决方法是使用相对路径,但是这要求您从固定位置执行二进制文件 - 也就是说,它会检查相对于`pwd`
而不是二进制文件的位置。
在任何人发出有关$ORIGIN
不安全/不安全的常见评论之前,这不是我们所处环境中的问题,我不希望听到关于它的评论。
它看起来像我必须这样做,但我不确定这可能有什么副作用,因为我不熟悉-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
等之前搜索到的第一组路径。 上一篇: GNU ld does not handle ORIGIN processing correctly; is there a workaround?