Tim*_*Tim 2 linux linker load dynamic-linking dynamic-loading
在Linux中,可执行的ELF文件分别是什么
其中哪些被调用
execve()dlopen()?他们如何援引execve()或者dlopen(),解决了鸡-蛋的问题,execve()或dlopen()用于调用可执行文件?
谢谢。
我认为您正在使用Jeff Darcy 的定义:
试图把所有东西都分开是没有意义的。相反,您应该考虑成对的特征:
/usr/bin/ld通常与静态库 ( .a)一起使用;加载器是内核;/usr/bin/ld再次出现,但具有共享库 ( .so);加载器是二进制文件的解释器,例如 /lib64/ld-linux-x86-64.so.2(/lib/x86_64-linux-gnu/ld-2.24.so当前映射到)64 位 x86 上的 Debian 9,它本身由内核加载,内核也加载主可执行文件;libdl;链接器在库和程序调用之间分开libdl。也许需要对最后一点进行更多解释。当一个程序用来libdl加载一个库时,它调用dlopen,它加载命名库以及它在进程中尚不可用的任何依赖项,并将命名库与其依赖项链接起来。因此libdl执行加载(必要的库)和链接(仅库,而不是调用程序)。当调用程序需要使用命名库中的符号时,它会调用dlsym 返回所请求符号的地址(如果它可以找到)。因此,调用程序执行部分链接。
没有与问候鸡还是先有蛋的问题execve或dlopen。编译使用的程序是使用execve适当的引用libc(包含大多数程序实际使用的包装器)和execve符号(严格来说,上述包装器)进行编译的。这些引用在编译时(对于静态链接的程序)或在加载时(对于动态链接的程序)解析;之后,该符号可供使用,程序可以调用execve. 这同样适用于dlopen:它要使用的程序dlopen与到适当的引用编译libdl和dlopen. 动态链接器本身是一个静态二进制文件,因此内核可以在没有动态链接器帮助的情况下加载它。您将在程序如何运行和程序如何运行:ELF 二进制文件中找到有关此主题的更多详细信息。
(请注意,在所有动态链接的情况下,如果启用了延迟绑定,链接可以及时发生,而不必在加载时发生。)