假设我的平台是使用 GNU 构建工具链(GCC 等)的 vanilla(非嵌入式)x86-64 Linux。
要指定$ORIGIN
in RPATH
,我知道链接器选项:-Wl,-rpath,'\$\$ORIGIN'
.
今天,我发现了另一种选择:-Wl,-z,origin
.
使用时我应该始终包括吗?-Wl,-z,origin
-Wl,-rpath,'\$\$ORIGIN'
官方 GNU ld 文档,说:
标记对象可能包含 $ORIGIN。
假设我的平台是使用 GNU 构建工具链(GCC 等)的 vanilla(非嵌入式)x86-64 Linux。
要指定$ORIGIN
in RPATH
,我知道链接器选项:-Wl,-rpath,'\$\$ORIGIN'
.
今天,我发现了另一种选择:-Wl,-z,origin
.
使用时我应该始终包括吗?-Wl,-z,origin
-Wl,-rpath,'\$\$ORIGIN'
官方 GNU ld 文档,说:
标记对象可能包含 $ORIGIN。
我知道链接器选项:
-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_ORIGIN
FLAGS_1
在当前的 GLIBC 主干中,没有任何东西查看该标志的值,因此如果您针对GLIBC
(大多数 Linux 程序都这样做),答案是:无论您是否使用都无关紧要-z origin
。
对于其他 libc 实现,答案可能会有所不同。但是,Solaris libc(整体$ORIGIN
来自哪里)似乎也不需要DF_ORIGIN
设置 ,因此完全忽略它可能是一个安全的选择。