參考:Linux動態鏈接器
Linux加載啟動可執行程序的過程(一)內核空間加載ELF的過程
本文和 理解ld-linux.so.2 內容上有點重復
動態鏈接器——Dynamic Linker
動態鏈接器既可以直接運行,也可以間接運行
間接運行
動態鏈接器可以通過一些動態鏈接的程序(dynamically linked program) 或 共享對象(shared object) 間接運行。對於動態鏈接器間接運行這種情況,動態鏈接器的命令行選項沒辦法傳給動態鏈接的程序 或 共享對象。像ELF這種情況,動態鏈接器的命令行選項放到了被執行程序的 .interp節中。
直接運行
動態鏈接器也可以采用如下方式直接運行:
/lib/ld-linux.so.* [OPTIONS] [PROGRAM [ARGUMENTS]]
不同二進制格式處理方式
程序ld.so和ld-linux.so *查找並加載程序需要的共享對象(共享庫),為程序運行做准備,然后運行程序。Linux二進制文件需要在運行時動態鏈接鏈接,除非在編譯期間給予ld命令-static選項。
a.out格式
程序ld.so處理a.out格式的二進制文件。a.out格式是很久以前使用的二進制格式。
ELF格式
ld-linux.so*處理ELF格式的二進制文件,ELF格式在Linux下已流行使用多年。(/lib/ld-linux.so.1用於libl5,/lib/ld-linux.so.2用於glibc2)
ld.so和ld-linux.so*處理二進制文件格式不同,如果相同,兩者就具有相同的行為,並支持相同文件和程序,如ldd,ldconfig和/etc/ld.so.conf。
注:libc是C庫。基本上,它包含大多數程序在Linux上運行所需要的系統功能。 同時,它也包含很多C運行時庫中的東西。libc6和glibc是相同的版本libc。官方的說法,它是GNU C庫的第2版(但它是Linux C庫的第六個主要版本)。目前用於Linux的libc有如下版本libc4,libc5,libc6。更多介紹參考:What's the difference between glibc and libc6?
共享對象依賴關系解析
在解析共享對象依賴關系時,動態鏈接器首先檢查依賴關系字符串,看它是否包含斜杠。
如果找到斜線,那么 依賴項字符串被解釋為(相對或絕對)路徑名,然后用哪個路徑名加載共享對象。
如果找不到斜杠,則按如下順序搜索:
1.編譯目標代碼時指定的動態庫搜索路徑;
2.環境變量LD_LIBRARY_PATH指定的動態庫搜索路徑;
3.配置文件/etc/ld.so.conf中指定的動態庫搜索路徑;
4.默認的動態庫搜索路徑/lib 或 /lib64;
5.默認的動態庫搜索路徑/usr/lib 或 /usr/lib64。