在 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 吗?

Official GNU ld docs,说:

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,originFLAGS_1 动态条目中设置 DF_ORIGIN

截至目前的 GLIBC 主干,无任何内容 查看该标志的值,因此如果您以 GLIBC 为目标(大多数 Linux 程序都这样做),答案是:使用 -z origin 与否没有关系。

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