kev*_*rpe 3 linux linker gcc shared rpath
假设我的平台是使用GNU构建工具链(GCC等)的vanilla(非嵌入式)x86-64 Linux.
要指定$ORIGIN的RPATH,我知道的链接器选项:-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
我知道链接器选项:
-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,origin组DF_ORIGIN中FLAGS_1动态条目.
从当前的GLIBC主干开始,没有看到该标志的值,所以如果你的目标GLIBC(大多数Linux程序都这样做),答案是:无论你是否使用它都无关紧要-z origin.
对于其他libc实现,答案可能不同.但是,Solaris libc(整体$ORIGIN来自)也似乎不需要DF_ORIGIN设置,所以完全忽略它可能是一个安全的选择.