動態鏈接到底是誰完成的呢?內核?
這個問題的根源在:使用動態鏈接庫可以省內存,因為多個進程可以共享物理內存;
老覺得這部分邏輯是在用戶態的動態加載器完成的,但是想想奇怪,動態加載器是嵌入到進程裏的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);
一個進程所以來的動態庫肯定是有
動態鏈接到底是誰完成的呢?內核?