这个问题的根源在:使用动态链接库可以省内存,因为多个进程可以共享物理内存;
老觉得这部分逻辑是在用户态的动态加载器完成的,但是想想奇怪,动态加载器是嵌入到进程里的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);
一个进程所以来的动态库肯定是有