ldd 查看程序/動態庫 的依賴
今天在幫同事查看一個問題時, 需要用到ldd, 于是就順便看了一下ldd的實現. 好在ldd本身只是一個腳本, 而不是executable, 可以直接查看實現的代碼.
根據注釋:
21 # This is the `ldd' command, which lists what shared libraries are
22 # used by given dynamically-linked executables. It works by invoking the
23 # run-time dynamic linker as a command and setting the environment
24 # variable LD_TRACE_LOADED_OBJECTS to a non-empty value.
LDD只是設置了LD_TRACE_LOADED_OBJECTS后, 再運行程序或調用/lib/ld-linux.so.2(或/lib64/ld-linux-x86-64.so.2或其他, 取決于系統的architecture等等)來處理動態庫, 再將輸出分析從而得到整個依賴關系.
于是對于正常的exectuable(以a.out為例)而言, 另一種獲得依賴關系列表的方式為:
export LD_TRACE_LOADED_OBJECTS=1
./a.out
輸出的結果為:
- linux-gate.so.1 => (0xb78b5000)
- librt.so.1 => /lib/tls/i686/cmov/librt.so.1 (0xb78a4000)
- libselinux.so.1 => /lib/libselinux.so.1 (0xb7889000)
- libacl.so.1 => /lib/libacl.so.1 (0xb7880000)
- libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7726000)
- libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb770d000)
- /lib/ld-linux.so.2 (0xb78b6000)
- libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7709000)
- libattr.so.1 => /lib/libattr.so.1 (0xb7703000)
而對于.so(假設有個liba.so)而言, 另一種獲得依賴關系的方式為:
export LD_TRACE_LOADED_OBJECTS=1
/lib/ld-linux.so.2 ./liba.so
輸出結果為:
- linux-gate.so.1 => (0xb777e000)
- libdb-4.8.so => /home/db/opt/dbxml/install/lib/libdb-4.8.so (0xb7360000)
- libxqilla.so.5 => /home/db/opt/dbxml/install/lib/libxqilla.so.5 (0xb6f10000)
- libxerces-c-3.0.so => /home/db/opt/dbxml/install/lib/libxerces-c-3.0.so (0xb6b6c000)
- libz.so.1 => /lib/libz.so.1 (0xb6b51000)
- libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb6a5b000)
- libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb6a35000)
- libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb68db000)
- libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb68bb000)
- libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb68a2000)
- libnsl.so.1 => /lib/tls/i686/cmov/libnsl.so.1 (0xb688b000)
- /lib/ld-linux.so.2 (0xb777f000)
運行中發現貌似/lib/ld-linux.so.2后面的參數是需要帶絕對路徑或者相對路徑的(當前目錄則需要用./作為前綴), 目前還不知道ld-linux.so.2是如何確定參數路徑的. 當然, 實際上executable也可以用/lib/ld-linux.so.2來獲得依賴列表.
實際上/lib/ld-linux.so.2是用來運行程序的. 當執行一個動態鏈接的程序時, 該工具被自動調用用來獲得并解析程序的依賴關系而后執行程序本身. 關于/lib/ld-linux.so.2命令的詳情, 參見 http://www.kernel.org/doc/man-pages/online/pages/man8/ld.so.8.html