在RPATH中指定$ ORIGIN的推荐GNU链接器选项有哪些?

时间:2015-11-22 09:29:18

标签: linux gcc linker shared rpath

假设我的平台是使用GNU构建工具链(GCC等)的vanilla(非嵌入式)x86-64 Linux。

要在$ORIGIN中指定RPATH,我知道链接器选项:-Wl,-rpath,'\$\$ORIGIN'

今天,我发现了另一种选择:-Wl,-z,origin

使用-Wl,-z,origin始终包括-Wl,-rpath,'\$\$ORIGIN'吗?

Official GNU ld docs,说:

  

标记对象可能包含$ ORIGIN。

相关但不同:https://stackoverflow.com/questions/33853271/what-are-the-recommended-gnu-linker-options-to-specify-rpath

1 个答案:

答案 0 :(得分:5)

  

我知道链接器选项:-Wl,-rpath,'\$\$ORIGIN'

你知道错误:上面的选项将做你想做的事。您想要的选项是-Wl,-rpath='$ORIGIN'。区别:

echo "int main() { }" | gcc -xc - -Wl,-rpath,'\$\$ORIGIN' &&
readelf -d a.out | grep ORIGIN

 0x000000000000000f (RPATH)              Library rpath: [\$\$ORIGIN]

echo "int main() { }" | gcc -xc - -Wl,-rpath='$ORIGIN' &&
readelf -d a.out | grep ORIGIN

 0x000000000000000f (RPATH)              Library rpath: [$ORIGIN]
  

我是否应该始终包含-Wl,-z,origin

-Wl,-z,originDF_ORIGIN动态条目中设置FLAGS_1

从当前的GLIBC主干开始,没有查看该标志的值,所以如果你定位GLIBC(大多数Linux程序都这样做),答案是:它没有'无论你是否使用-z origin,都要重要一点。

其他libc实现的答案可能有所不同。但是,Solaris libc(整个$ORIGIN来自的地方)似乎也不需要设置DF_ORIGIN,所以完全忽略它可能是一个安全的选择。