Linux动态链接器
我开始以为动态链接器ld-linux.so.x是linux内核的一部分,其实这种想法是错误的。分析完ELF可执行文件在内核中加载启动的源码后,可以参考博主的这两篇博客Linux加载启动可执行程序的过程(一)内核空间加载ELF的过程Linux加载启动可执行程序的过程(二)解释器完成动态链接我们可以知道,识别二进制映像以及文件映射到进程虚拟地址空间这个过程确实是在内核中完成的,但是动态链接的过程,需要
我开始以为动态链接器ld-linux.so.x是linux内核的一部分,其实这种想法是错误的。
分析完ELF可执行文件在内核中加载启动的源码后,可以参考博主的这两篇博客
Linux加载启动可执行程序的过程(一)内核空间加载ELF的过程
我们可以知道,识别二进制映像以及文件映射到进程虚拟地址空间这个过程确实是在内核中完成的,但是动态链接的过程,需要把控制权交给ld-linux.so.x,这是在用户空间进行的。由此可见,我们的程序在被内核加载到内存,内核跳到用户空间后并不是执行目标程序的,而是先把控制权交到用户空间的动态链接器,由动态链接器加载运行用户程序所需要的动态库(比如libc.so.x等等),然后控制权才会转移到用户程序。
这样就好理解了:如果通过gcc生成ELF可执行文件,那么会调用到Glibc的函数库,要动态调用Glibc函数,当然不是在内核中能完成的事情了。再者,ld-linux.so.x是Glibc安装的库,所以动态链接的过程实际上这跟编译一样,属于用户态程序,核心代码在elf/rtld.c中。
附:动态链接库的加载顺序
1.编译目标代码时指定的动态库搜索路径;
2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径;
3.配置文件/etc/ld.so.conf中指定的动态库搜索路径;
4.默认的动态库搜索路径/lib;
5.默认的动态库搜索路径/usr/lib。
更多推荐
所有评论(0)