linux - 在 RPATH 中指定 $ORIGIN 的推荐 GNU 链接器选项是什么?

标签 linux gcc linker shared rpath

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

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

今天,我发现了另一个选项:-Wl,-z,origin

在使用 -Wl,-rpath,'\$\$ORIGIN' 时,我是否应该始终包含 -Wl,-z,origin

Official GNU ld docs ,说:

Marks the object may contain $ORIGIN.

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

最佳答案

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,所以完全忽略它可能是一个安全的选择.

关于linux - 在 RPATH 中指定 $ORIGIN 的推荐 GNU 链接器选项是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33853344/

相关文章:

c - 在哪里可以找到例如 netlink 的源代码?

c - 为什么 GCC/Clang 的清除属性不能与函数参数一起使用

gcc - 在64位环境下执行32位目标文件

iphone - iPhone-XCode 4链接器错误,没有方法调用或对象使用

c++ - 我如何正确地将 asm 文件链接到 C++?

c++ - 消除 MS Visual C++ 链接器警告 : "warning LNK4221"? 的最佳方法是什么

c - 为什么popen打开的文件是空的?

android - 内核如何知道 USB 设备何时自行进入低功耗模式(不是由主机启动)?

c++ - 是否可以从代码中获取依赖库的位置

linux - GDB 警告 : Loadable section not found in added symbol-file system-supplied DSO at 0x7ffff7ffd000