在RPATH中指定$ ORIGIN的推荐GNU链接器选项有哪些?

kev*_*rpe 3 linux linker gcc shared rpath

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

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

今天,我发现了另一种选择:-Wl,-z,origin.

使用时我应该总是包括在内吗?-Wl,-z,origin-Wl,-rpath,'\$\$ORIGIN'

官方GNU ld文档,说:

标记对象可能包含$ ORIGIN.

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

Emp*_*ian 7

我知道链接器选项: -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]
Run Code Online (Sandbox Code Playgroud)

我应该总是包括 -Wl,-z,origin

-Wl,-z,originDF_ORIGINFLAGS_1动态条目.

从当前的GLIBC主干开始,没有看到该标志的值,所以如果你的目标GLIBC(大多数Linux程序都这样做),答案是:无论你是否使用它都无关紧要-z origin.

对于其他libc实现,答案可能不同.但是,Solaris libc(整体$ORIGIN来自)也似乎不需要DF_ORIGIN设置,所以完全忽略它可能是一个安全的选择.