码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-03-17 10:48:43      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:and   物理内存   应该   执行   fast   世界   handle   arch   class   

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

老觉得这部分逻辑是在用户态的动态加载器完成的,但是想想奇怪,动态加载器是嵌入到进程里的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);

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

 

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

标签:and   物理内存   应该   执行   fast   世界   handle   arch   class   

原文地址:https://www.cnblogs.com/honpey/p/8587140.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!