Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么libc依赖于ld.so?_C_Linux_Glibc_Dynamic Linking - Fatal编程技术网

为什么libc依赖于ld.so?

为什么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*查找并加载共享 程序所需的对象(共享库),请准备 程序

我一直认为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*
查找并加载共享 程序所需的对象(共享库),请准备 程序运行,然后运行它

应用程序通常不调用从<代码> 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不会改变这一点。