微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么 libc 依赖于 ld.so?

如何解决为什么 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* 的依赖是通过 ELF 文件的 .interp 部分建立的(参见 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 的原因。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。