3

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

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

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

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

官方 GNU ld 文档,说:

标记对象可能包含 $ORIGIN。

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

4

1 回答 1

9

我知道链接器选项:-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,origin集合。DF_ORIGINFLAGS_1

在当前的 GLIBC 主干中,没有任何东西查看该标志的值,因此如果您针对GLIBC(大多数 Linux 程序都这样做),答案是:无论您是否使用都无关紧要-z origin

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

于 2015-11-23T00:47:29.203 回答