为什么libc依赖于ld.so?
我一直认为libc应该是一个独立的动态库,直到我发现:为什么libc依赖于ld.so?,c,linux,glibc,dynamic-linking,C,Linux,Glibc,Dynamic Linking,我一直认为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 linux.so*查找并加载共享 程序所需的对象(共享库),请准备 程序
$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 linux.so*
查找并加载共享
程序所需的对象(共享库),请准备
程序运行,然后运行它
应用程序通常不调用从<代码> LD LIUX-X8664中的任何函数。所以,它加载可执行文件和共享库,并将控制流传递给应用程序,该应用程序通常是C和C++库运行时初始化代码。这种对ld linux.so*
的依赖是通过ELF文件的.interp
部分建立的(请参见readelf-l/lib/x86\u 64-linux-gnu/libc.so.6
输出),而这不是ldd
显示的内容
ldd
,但是,(递归地)在动态部分显示标记为NEEDED
的库(请参见readelf-d/lib/x86_64-linux-gnu/libc.so.6
output)。在Linux上,共享库的线程本地存储支持由/lib64/ld-Linux-x86-64.so.2
实现。这是一个实现细节,但也是glibc依赖ld-linux-x86-64的原因。因此,与共享库链接的任何应用程序或共享库都需要。:
程序ld.so
和ld linux.so*
查找并加载共享
程序所需的对象(共享库),请准备
程序运行,然后运行它
应用程序通常不调用从<代码> LD LIUX-X8664中的任何函数。所以,它加载可执行文件和共享库,并将控制流传递给应用程序,该应用程序通常是C和C++库运行时初始化代码。这种对ld linux.so*
的依赖是通过ELF文件的.interp
部分建立的(请参见readelf-l/lib/x86\u 64-linux-gnu/libc.so.6
输出),而这不是ldd
显示的内容
ldd
,但是,(递归地)在动态部分显示标记为NEEDED
的库(请参见readelf-d/lib/x86_64-linux-gnu/libc.so.6
output)。在Linux上,共享库的线程本地存储支持由/lib64/ld-Linux-x86-64.so.2
实现。这是一个实现细节,但也是glibc依赖于ld-linux-x86-64的原因。因此。添加共享二进制文件通常将/lib64/ld-linux-x86-64.so.2
作为其解释器是很有用的。内核将通过从ELF二进制文件读取入口点和解释器来执行二进制文件,然后决定如何调用它。正在调用解释器并向其提供原始二进制文件的名称和文件权限。然后库加载器/lib64/ld-linux-x86-64.so.2加载所有依赖项并跳转到动态二进制文件的入口点。这样,不使用线程本地存储的共享库就不会使用ld-linux.so
作为DT\u NEED
,对吗?@yhdang,正如我提到的,glibc链接ld-linux-x86-64.so,因为后者解析glibc中未解析的符号,其中一些符号处理TLS。不使用TLS不会改变这一点。添加一点很有用,即共享二进制文件通常将/lib64/ld-linux-x86-64.so.2
作为其解释器。内核将通过从ELF二进制文件读取入口点和解释器来执行二进制文件,然后决定如何调用它。正在调用解释器并向其提供原始二进制文件的名称和文件权限。然后库加载器/lib64/ld-linux-x86-64.so.2加载所有依赖项并跳转到动态二进制文件的入口点。这样,不使用线程本地存储的共享库就不会使用ld-linux.so
作为DT\u NEED
,对吗?@yhdang,正如我提到的,glibc链接ld-linux-x86-64.so,因为后者解析glibc中未解析的符号,其中一些符号处理TLS。不使用TLS不会改变这一点。