Linux動態連接器


轉自:Chapter 9. Dynamic Linking

參考:Linux動態鏈接器

Linux加載啟動可執行程序的過程(一)內核空間加載ELF的過程

Linux加載啟動可執行程序的過程(二)解釋器完成動態鏈接

本文和 理解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。

         
     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM