我開始以爲動態鏈接器ld-linux.so.x是linux內核的一部分,其實這種想法是錯誤的。
分析完ELF可執行文件在內核中加載啓動的源碼後,可以參考博主的這兩篇博客
Linux加載啓動可執行程序的過程(一)內核空間加載ELF的過程
我們可以知道,識別二進制映像以及文件映射到進程虛擬地址空間這個過程確實是在內核中完成的,但是動態鏈接的過程,需要把控制權交給ld-linux.so.x,這是在用戶空間進行的。由此可見,我們的程序在被內核加載到內存,內核跳到用戶空間後並不是執行目標程序的,而是先把控制權交到用戶空間的動態鏈接器,由動態鏈接器加載運行用戶程序所需要的動態庫(比如libc.so.x等等),然後控制權纔會轉移到用戶程序。
這樣就好理解了:如果通過gcc生成ELF可執行文件,那麼會調用到Glibc的函數庫,要動態調用Glibc函數,當然不是在內核中能完成的事情了。再者,ld-linux.so.x是Glibc安裝的庫,所以動態鏈接的過程實際上這跟編譯一樣,屬於用戶態程序,核心代碼在elf/rtld.c中。
附:動態鏈接庫的加載順序
1.編譯目標代碼時指定的動態庫搜索路徑;
2.環境變量LD_LIBRARY_PATH指定的動態庫搜索路徑;
3.配置文件/etc/ld.so.conf中指定的動態庫搜索路徑;
4.默認的動態庫搜索路徑/lib;
5.默認的動態庫搜索路徑/usr/lib。