歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux ldd命令學習

Linux ldd命令學習

日期:2017/2/28 14:37:20   编辑:Linux教程

ldd命令用來顯示可執行程序的dependency,
sh-# ldd ./test_main
libc.so.6 => /lib/libc.so.6 (0x40113000)
/lib/ld-linux.so.3 (0x40022000)
sh-#

sh-# ldd -d ./test_main
libc.so.6 => /lib/libc.so.6 (0x4011a000)
/lib/ld-linux.so.3 (0x400f4000)
sh-#

sh-# ldd -r ./test_main
libc.so.6 => /lib/libc.so.6 (0x401d4000)
/lib/ld-linux.so.3 (0x400fb000)
sh-#

sh-# ldd -v ./test_main
libc.so.6 => /lib/libc.so.6 (0x4009d000)
/lib/ld-linux.so.3 (0x40077000)

Version information:
./test_main:
libc.so.6 (GLIBC_2.4) => /lib/libc.so.6
/lib/libc.so.6:
ld-linux.so.3 (GLIBC_2.4) => /lib/ld-linux.so.3
ld-linux.so.3 (GLIBC_PRIVATE) => /lib/ld-linux.so.3
sh-#

ldd命令本身不是一個可執行程序,它只是一個shell腳本,
sh-# which ldd
/usr/bin/ldd
sh-#
sh-# ldd /usr/bin/ldd
not a dynamic executable
sh-#
sh-# ldd /bin/ln
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x40061000)
libc.so.6 => /lib/libc.so.6 (0x400cd000)
/lib/ld-linux.so.3 (0x4003b000)
sh-#
sh-# ldd /bin/top
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x401b6000)
libc.so.6 => /lib/libc.so.6 (0x401c9000)
/lib/ld-linux.so.3 (0x40013000)
sh-#

sh-# ls -lh /lib/libc.so.6
lrwxrwxrwx 1 root root 14 Nov 6 08:28 /lib/libc.so.6 -> libc-2.12.2.so
sh-# ls -lh /lib/libc-2.12.2.so
-rwxr-xr-x 1 root root 1.2M Nov 6 08:28 /lib/libc-2.12.2.so
sh-#

sh-# ls -lh /lib/ld-linux.so.3
lrwxrwxrwx 1 root root 12 Nov 6 08:28 /lib/ld-linux.so.3 -> ld-2.12.2.so
sh-# ls -lh /lib/ld-2.12.2.so
-rwxr-xr-x 1 root root 120K Nov 6 08:28 /lib/ld-2.12.2.so
sh-#

sh-# ./test_main &
31631
sh-#
<xulin>test_main

sh-#
sh-# ps aux | grep test_main
root 1304 0.0 0.1 1728 544 ? S+ 12:13 0:00 grep test_main
root 2324 0.0 0.1 1460 324 ? S+ 11:22 0:00 ./test_main
root 31631 0.0 0.1 1460 324 ? S+ 12:10 0:00 ./test_main
sh-#

ldd命令的工作原理是通過設置一些環境變量來實現的,這些環境變量包括:
LD_TRACE_LOADED_ONJECTS、LD_WARN、LD_DEBUG、LD_VERBOSE、...
比如默認情況下執行ldd命令就會設置LD_TRACE_LOADED_ONJECTS,所以就能查看各個可執行程序的dependency。
sh-# ldd ./test_main
libc.so.6 => /lib/libc.so.6 (0x400e7000)
/lib/ld-linux.so.3 (0x40068000)
sh-#

可以手動設置這個環境變量,然後在執行test_main程序,
sh-# export LD_TRACE_LOADED_OBJECTS=1
sh-# ./test_main
libc.so.6 => /lib/libc.so.6 (0x400ca000)
/lib/ld-linux.so.3 (0x400a4000)
sh-#

使用unset命令將這個環境變量刪除,即可恢復原狀了,
sh-# unset LD_TRACE_LOADED_OBJECTS
sh-# ./test_main &
26003
sh-#
<xulin>test_main

sh-#

ldd命令工作原理其實質上是通過ld-linux.so來實現的,
ld-linux.so會先於可執行程序工作並獲得控制權。
實際上可以直接使用ld-linux.so來查看可執行程序的共享庫依賴關系。
sh-# /lib/ld-linux.so.3 --list ./test_main
libc.so.6 => /lib/libc.so.6 (0x40204000)
/lib/ld-linux.so.3 (0x4005a000)
sh-#
sh-# ldd ./test_main
libc.so.6 => /lib/libc.so.6 (0x40180000)
/lib/ld-linux.so.3 (0x40077000)
sh-#

可以試驗將libc.so.6刪除掉,再來看是否可以執行test_main這個程序。
通過確認發現,/lib/所在的文件系統為只讀文件系統,所以無法進行刪除操作。

Copyright © Linux教程網 All Rights Reserved