为什么libc依赖于ld.so?

我一直认为libc应该是一个独立的动态库,直到我发现这个:

$ ldd /lib/x86_64-linux-gnu/libc.so.6
        /lib64/ld-linux-x86-64.so.2 (0x00007fd743c00000)
        linux-vdso.so.1 (0x00007fffc75f4000)

有人能告诉我为什么 libc 需要 ld.so 以及它使用什么功能吗?

回答

ld.so 与共享库链接的任何应用程序或共享库都需要:

程序ld.sold-linux.so*查找并加载程序所需的共享对象(共享库),准备程序运行,然后运行它。

应用程序通常不会从 调用任何函数ld-linux-x86-64.so,而是加载可执行和共享库并将控制流传递给应用程序,这通常是 C 和 C++ 库运行时初始化代码。这种依赖ld-linux.so*是通过.interpELF 文件的部分建立的(见readelf -l /lib/x86_64-linux-gnu/libc.so.6输出),这不是ldd显示的内容。

ldd,但是,(递归地)显示标记为NEEDED动态部分的库(参见readelf -d /lib/x86_64-linux-gnu/libc.so.6输出)。在 Linux 上,共享库的线程本地存储支持由/lib64/ld-linux-x86-64.so.2. 这是一个实现细节,但也是 glibc 依赖 ld-linux-x86-64.so 的原因。


以上是为什么libc依赖于ld.so?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>