linux中動態庫的編譯和加載的查找順序

Glibc安裝的庫中有一個名爲ld-Linux.so.X其中X爲一個數字(版本),
在不同的平臺上可以通過ldd查看
$ldd /bin/cat
linux-vdso.so.1 =>  (0x00007fff9176f000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f16424d4000)
/lib64/ld-linux-x86-64.so.2 (0x00005592863c5000)

其中linux-vdso.so.1不是一個實際的庫文件,它是一個虛擬庫文件用來
和kernel交互。
ld-linux-x86_64.so.2是專門用來負責尋找庫文件的庫。以cat爲例,cat
首先告訴ld-linux-x86_64.so.2它需要libc.so.6這個庫文件,ld-linux-x86_64.so
將按照一定的順序來查找libc.so.6,再給cat進行調用。

===========================================================
問題1:ld-linux-x86_64.so.2這個庫是如何被找到的?
ld-linux-x86_64.so.2這個庫的位置是通過gcc編譯器寫死在裏面的。gcc寫到程序中
ld-linux-x86_64.so.2的位置是可以改變的,通過gcc的spec文件。

============================================================
運行時,ld-linux.so查找共享庫的順序
1.ld-linux.so在可執行的目標中被指定,可以通過readelf命令查看。
2.ld-linux.so缺省在/usr/lib和lib中搜索,當glibc安裝到/usr/local中時,
  它查找/usr/local/lib
3.LD_LIBRARY_PATH 環境變量中設定的路徑
4./etc/ld.so.conf (或/usr/local/etc/ld.so.conf)中所指定的路徑,
  由ldconfig生成的二進制ld.so.cache中。
 
============================================================
編譯時,ld-linux.so查找共享庫的順序
1.ld-linux.so由gcc的spec文件所指定
2.gcc --print-search-dirs所打印的路徑,主要是libgcc_s.so等庫
3.LIBRARY_PATH環境變量所設定的路徑,或編譯的命令行中指定 -L/usr/local/lib
4.binutils中的ld所設定的缺省搜索路徑順序,編譯binutils時指定
  可以通過 `ld --verbose | grep SEARCH` 來查看
  ld --verbose | grep SEARCH | awk 'BEGIN{RS="; "} { print $0;}'
  可以按照行來查看記錄
5.二進制程序的搜索路徑順序爲PATH環境變量中所設定,一般/usr/local/bin高於/usr/bin
6.編譯的頭文件的搜索路徑順序與library的查找順序類似,一般/usr/local/include高於/usr/include



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章