1. 程式人生 > >動態鏈接到底是誰完成的呢?內核?

動態鏈接到底是誰完成的呢?內核?

函數 exe 而已 try BE 物理 OS 不同的 函數調用

這個問題的根源在:使用動態鏈接庫可以省內存,因為多個進程可以共享物理內存;

老覺得這部分邏輯是在用戶態的動態加載器完成的,但是想想奇怪,動態加載器是嵌入到進程裏的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);

一個進程所以來的動態庫肯定是有

動態鏈接到底是誰完成的呢?內核?