libc.so.6 和 liblsp.so 之间的循环引用?

Circular reference between libc.so.6 and liblsp.so?

▶ldd /lib/x86_64-linux-gnu/libc.so.6
        linux-vdso.so.1 (0x00007fff2b856000)
        /lib/$LIB/liblsp.so => /lib/lib/x86_64-linux-gnu/liblsp.so (0x00007f472effc000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f472f3f5000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f472efd5000)

▶ldd /lib/lib/x86_64-linux-gnu/liblsp.so
        linux-vdso.so.1 (0x00007ffe305ee000)
        /lib/$LIB/liblsp.so => /lib/lib/x86_64-linux-gnu/liblsp.so (0x00007f28eea81000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f28eea5a000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f28ee868000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f28eee8d000)

我们可以在libc.so.6 和liblsp.so 之间找到一个循环引用。它是如何工作的?

How does it works?

  1. libc.so.6 并不 真的 依赖于 liblsp.so。您可以使用 readelf -d /lib/x86_64-linux-gnu/libc.so.6 | grep NEEDED.
    来验证这一点 ldd 显示它的原因是它列在您的 /etc/ld.so.preload.
  2. 正如 Nate Eldredge 评论的那样,这个“循环”并不重要——加载程序需要加载依赖库尚未加载。如果一个库已经加载,加载器简单地增加它的引用计数。