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
輸出的結果為:

  1. linux-gate.so.1 => (0xb78b5000)
  2. librt.so.1 => /lib/tls/i686/cmov/librt.so.1 (0xb78a4000)
  3. libselinux.so.1 => /lib/libselinux.so.1 (0xb7889000)
  4. libacl.so.1 => /lib/libacl.so.1 (0xb7880000)
  5. libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7726000)
  6. libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb770d000)
  7. /lib/ld-linux.so.2 (0xb78b6000)
  8. libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7709000)
  9. libattr.so.1 => /lib/libattr.so.1 (0xb7703000)


而對於.so(假設有個liba.so)而言, 另一種獲得依賴關系的方式為:
export LD_TRACE_LOADED_OBJECTS=1
/lib/ld-linux.so.2 ./liba.so
輸出結果為:

  1. linux-gate.so.1 => (0xb777e000)
  2. libdb-4.8.so => /home/db/opt/dbxml/install/lib/libdb-4.8.so (0xb7360000)
  3. libxqilla.so.5 => /home/db/opt/dbxml/install/lib/libxqilla.so.5 (0xb6f10000)
  4. libxerces-c-3.0.so => /home/db/opt/dbxml/install/lib/libxerces-c-3.0.so (0xb6b6c000)
  5. libz.so.1 => /lib/libz.so.1 (0xb6b51000)
  6. libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb6a5b000)
  7. libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb6a35000)
  8. libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb68db000)
  9. libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb68bb000)
  10. libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb68a2000)
  11. libnsl.so.1 => /lib/tls/i686/cmov/libnsl.so.1 (0xb688b000)
  12. /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


免責聲明!

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



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