“静态链接”是什么意思?

“静态链接”是什么意思?

按照我的理解,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()它们进行检查并为动态库的调用创建正确的偏移量。由于该运行时链接器正在执行该工作,因此它不能依赖于其他动态对象。

相关内容