为什么 libc 依赖 ld.so?
Why does libc depend on 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 以及它使用什么功能?
与共享库链接的任何应用程序或共享库都需要
The programs ld.so
and ld-linux.so*
find and load the shared
objects (shared libraries) needed by a program, prepare the
program to run, and then run it.
应用程序通常不会调用 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.
的原因
我一直认为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 以及它使用什么功能?
The programs
ld.so
andld-linux.so*
find and load the shared objects (shared libraries) needed by a program, prepare the program to run, and then run it.
应用程序通常不会调用 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.