使用共享库的可执行文件加载时,动态链接器ld.linux.so如何链接?
关于ld.linux.so的链接方式解答
ld.linux.so 确实是静态链接的,而且是一种特殊的静态链接——它本身不能依赖任何其他共享库,否则会陷入无法解决的循环依赖问题。
为什么必须静态链接?
因为 ld.linux.so 是系统中负责加载其他动态共享库的核心程序,如果它自己还需要别的共享库来启动,那谁来加载那些依赖?总不能存在另一个动态链接器来加载它,这会形成无限递归。所以它必须是一个完全独立、不依赖外部.so文件的可执行实体。它的链接过程是什么样的?
编译 ld.linux.so 的源码时,会采用静态链接模式,把所有必要的代码(比如ELF文件解析逻辑、内存管理、共享库加载与重定位的核心代码等)直接打包到自身文件中。你可以用几个命令验证:- 执行
file /lib64/ld-linux-x86-64.so.2,输出会显示它是 "ELF 64-bit LSB pie executable" 或 "shared object",但本质上它具备可执行入口; - 用
ldd /lib64/ld-linux-x86-64.so.2查看依赖,会得到 "not a dynamic executable" 的提示,说明它没有外部共享库依赖。
- 执行
补充说明:
虽然它的文件名带.so后缀,但它是一个特殊的可执行文件。当你运行一个动态链接的程序时,内核会先找到并加载 ld.linux.so,由它完成目标程序所有依赖共享库的加载、地址重定位等工作,最后再把控制权转交给目标程序。
内容的提问来源于stack exchange,提问作者zkh
相关产品推荐
相关产品推荐

