在 RPATH 中指定 $ORIGIN 的推荐 GNU 链接器选项是什么?
What are the recommended GNU linker options to specify $ORIGIN in RPATH?
假设我的平台是 vanilla(非嵌入式)x86-64 Linux 使用 GNU 构建工具链(GCC 等)。
要在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
,因此完全忽略它可能是一个安全的选择。
假设我的平台是 vanilla(非嵌入式)x86-64 Linux 使用 GNU 构建工具链(GCC 等)。
要在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
,因此完全忽略它可能是一个安全的选择。