假设我的平台是使用GNU构建工具链(GCC等)的vanilla(非嵌入式)x86-64 Linux。
要在$ORIGIN
中指定RPATH
,我知道链接器选项:-Wl,-rpath,'\$\$ORIGIN'
。
今天,我发现了另一种选择:-Wl,-z,origin
。
使用-Wl,-z,origin
时始终包括-Wl,-rpath,'\$\$ORIGIN'
吗?
标记对象可能包含$ ORIGIN。
答案 0 :(得分:5)
我知道链接器选项:
-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]
我是否应该始终包含
-Wl,-z,origin
-Wl,-z,origin
在DF_ORIGIN
动态条目中设置FLAGS_1
。
从当前的GLIBC主干开始,没有查看该标志的值,所以如果你定位GLIBC
(大多数Linux程序都这样做),答案是:它没有'无论你是否使用-z origin
,都要重要一点。
其他libc实现的答案可能有所不同。但是,Solaris libc(整个$ORIGIN
来自的地方)似乎也不需要设置DF_ORIGIN
,所以完全忽略它可能是一个安全的选择。