当我运行'ldd some_executable_file'时,它显示了此exe所需的依赖项,如“libm.so.6 => /usr/lib 64/libm.so.6(0x 00007 ff 2 eaf 52000)"。虽然列表中的一些依赖项以“some_absoulute_path/ld-linux-x86-64.so.2 => /lib 64/ld-linux-x86-64.so.2(0x 00007 ff 2 eba 92000)”的形式出现,但似乎左侧文件并不指向右侧文件
根据一些测试,左边的文件被选为依赖路径,而右边的文件没有,那么符号“=>”是什么意思呢?
1条答案
按热度按时间yr9zkbsy1#
问题是
ldd
的输出是误导性的(至少对于不使用系统ld-linux
的二进制文件来说是这样)。大约10年前,
ldd
使用了“嵌入”二进制文件的 actual 程序解释器(这里是some_absoulute_path/ld-linux-x86-64.so.2
)。然而,这被认为是一个安全风险,因为root用户可能会运行
ldd some-foreign-binary
,这将导致“baked in interpreter”以root用户身份运行,这不一定是系统管理员所期望的。所以现在
ldd
使用 systemld-linux
,而不管“baked in”解释器,这导致了这里的“错误”输出:如果你真的要运行这个二进制文件,它不会使用
/lib64/ld-linux-x86-64.so.2
;它将使用实际的“内置”解释器some_absoulute_path/ld-linux-x86-64.so.2
。要获得 * 准确 * 的
ldd
结果,您应该运行与some_absoulute_path/ld-linux-x86-64.so.2
匹配的ldd
。这里可能是/opt/compiler/gcc-8.2/bin/ldd
。