据我了解,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
为什么我会得到这样的输出?这是什么意思?
该文件不使用动态库,而是在可执行文件中包含所需的库部分。
结果,
ldd
无法告诉您有关该文件的任何信息。这意味着可执行文件不需要动态库,但这也意味着它无法从库中的错误修复中受益,并且如果更改内核接口,静态可执行文件将无法与更改后的新内核一起使用。
在您的特殊情况下,您正在检查所谓
run time linker
的用于在运行时将动态库链接到主二进制文件的方法,方法是mmap()
对它们进行 ing 并为调用动态库创建正确的偏移量。由于这个运行时链接器正在做这项工作,它不能依赖于其他动态对象。