按照我的理解,so
文件就是动态库。我们可以用来ldd
打印它的依赖关系。
例如,我可以执行ldd -r /usr/lib/aarch64-linux-gnu/libstdc++.so.6
以获得如下输出:
linux-vdso.so.1 => (0x0000ffff793f7000)
libm.so.6 => /lib/aarch64-linux-gnu/libm.so.6 (0x0000ffff79173000)
libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x0000ffff7902c000)
/lib/ld-linux-aarch64.so.1 (0x0000aaaae0a5d000)
libgcc_s.so.1 => /lib/aarch64-linux-gnu/libgcc_s.so.1 (0x0000ffff7900b000)
然而,今天当我执行时ldd -r /lib/ld-linux-aarch64.so.1
,我得到了这个:
statically linked
为什么我会得到这样的输出?这是什么意思?
答案1
该文件不使用动态库,而是在可执行文件中包含库所需的部分。
因此,ldd
无法告诉您有关该文件的任何信息。
这意味着可执行文件不需要动态库,但这也意味着它无法从库中的错误修复中受益,并且如果内核接口发生更改,静态可执行文件将无法与更改后的新内核一起使用。
在您的特殊情况下,您正在检查所谓的run time linker
用于在运行时将动态库链接到主二进制文件的方法,方法是对mmap()
它们进行检查并为动态库的调用创建正确的偏移量。由于该运行时链接器正在执行该工作,因此它不能依赖于其他动态对象。