假设我的平台是使用 GNU 构建工具链(GCC 等)的 vanilla(非嵌入式)x86-64 Linux。
要在 RPATH
中指定 $ORIGIN
,我知道链接器选项:-Wl,-rpath,'\$\$ORIGIN'
.
今天,我发现了另一个选项:-Wl,-z,origin
。
在使用 -Wl,-rpath,'\$\$ORIGIN'
时,我是否应该始终包含 -Wl,-z,origin
?
Marks the object may contain $ORIGIN.
最佳答案
I know about the linker option:
-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]
Should I always include
-Wl,-z,origin
-Wl,-z,origin
在FLAGS_1
动态条目中设置DF_ORIGIN
。
对于当前的 GLIBC 主干,没有查看该标志的值,因此如果您以 GLIBC
为目标(大多数 Linux 程序都这样做),答案是:它不会是否使用 -z origin
一点都不重要。
其他 libc 实现的答案可能不同。然而,Solaris libc(整个 $ORIGIN
的来源)似乎也不需要设置 DF_ORIGIN
,所以完全忽略它可能是一个安全的选择.
关于linux - 在 RPATH 中指定 $ORIGIN 的推荐 GNU 链接器选项是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33853344/