动态链接到底是谁完成的呢?内核?

Posted honpey

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态链接到底是谁完成的呢?内核?相关的知识,希望对你有一定的参考价值。

这个问题的根源在:使用动态链接库可以省内存,因为多个进程可以共享物理内存;

老觉得这部分逻辑是在用户态的动态加载器完成的,但是想想奇怪,动态加载器是嵌入到进程里的so,案例说是不会感知到外面的世界的啊,难道是内核?

【等等,动态加载器,可能直接就是在不同的进程中中共享的一份,是不是它本身就记录着整个内核层面的库的使用捏?】

在内核中看到一个函数load_elf_interp: 使用stap抓一下函数调用栈

0xffffffff81267e2c : load_elf_binary+0x8fc/0x1170 [kernel]
 0xffffffff81212bee : search_binary_handler+0x9e/0x1d0 [kernel]
 0xffffffff81214353 : do_execveat_common.isra.33+0x533/0x710 [kernel]
 0xffffffff812147ca : sys_execve+0x3a/0x50 [kernel]
 0xffffffff81824795 : return_from_execve+0x0/0x23 [kernel]
 0xffffffff818244f2 : entry_SYSCALL_64_fastpath+0x16/0x71 [kernel] (inexact)

load_elf_binary函数会调用load_elf_interp

本来就应该是内核做的呀,毕竟启动进程是在shell里简简单单做了一个exec而已,内核里面是如何调用动态加载器的?内核把应该映射的段映射好,然后就是

真是丫的长见识了,竟然是: kernel_read(bprm->file, elf_ppnt->p_offset,内核中按照file结构体去读数据出来呢;

先是执行动态加载器,然后再是入口处执行呢,只是动态加载器在

依赖的动态库是怎么加载进来的呢?是内核加载的,还是动态加载器?内核当中直接调用这个函数读取动态加载器。。。open_exec

interpreter = open_exec(elf_interpreter);

一个进程所以来的动态库肯定是有

 

以上是关于动态链接到底是谁完成的呢?内核?的主要内容,如果未能解决你的问题,请参考以下文章

linux下的动态链接库和静态链接库到底是个什么鬼?动态链接库的编译与使用

内核作为动态链接器范例?

聊聊Linux动态链接中的PLT和GOT—— 穿针引线

gcc 编译使用动态链接库和静态链接库

linux下查看动态链接库so文件的依赖的相关组建

linux下.so.ko.a的区别