ldd命令
ldd命令用于打印程序或者库文件所依赖的动态库列表。
语法
ldd (选项) (参数)
选项
-v:详细打印信息模式,打印所以相关信息。
root@68fc0a9bc6dd:/home/wzm/go/src# ldd ldd.so
linux-vdso.so.1 => (0x00007ffc2d3de000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fe750662000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe750298000)
/lib64/ld-linux-x86-64.so.2 (0x00007fe750d0e000)
root@68fc0a9bc6dd:/home/wzm/go/src# ldd -v ldd.so
linux-vdso.so.1 => (0x00007ffeea18c000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f90c4224000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f90c3e5a000)
/lib64/ld-linux-x86-64.so.2 (0x00007f90c48d0000)
Version information:
./ldd.so:
libpthread.so.0 (GLIBC_2.3.2) => /lib/x86_64-linux-gnu/libpthread.so.0
libpthread.so.0 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libpthread.so.0
libc.so.6 (GLIBC_2.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3.4) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libpthread.so.0:
ld-linux-x86-64.so.2 (GLIBC_2.2.5) => /lib64/ld-linux-x86-64.so.2
ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2
libc.so.6 (GLIBC_2.14) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.3.2) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib/x86_64-linux-gnu/libc.so.6
libc.so.6 (GLIBC_PRIVATE) => /lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libc.so.6:
ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2
-u:打印未使用的直接依赖
root@68fc0a9bc6dd:/home/wzm/go/src# ldd myldd
linux-vdso.so.1 => (0x00007ffe913c9000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fc86c5dd000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fc86c3c0000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc86bff6000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc86c7e1000)
root@68fc0a9bc6dd:/home/wzm/go/src# ldd -u myldd
root@68fc0a9bc6dd:/home/wzm/go/src#
-d:执行重定位和报告任何丢失的对象。(默认带该值)
-r:执行数据对象和函数重定位,并且报告任何任何丢失的对象和函数。
root@68fc0a9bc6dd:/home/wzm/go/src# ldd myldd
linux-vdso.so.1 => (0x00007ffd013bd000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fd68a397000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fd68a17a000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd689db0000)
/lib64/ld-linux-x86-64.so.2 (0x00007fd68a59b000)
root@68fc0a9bc6dd:/home/wzm/go/src# ldd -r myldd
linux-vdso.so.1 => (0x00007ffe7e123000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fd585612000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fd5853f5000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd58502b000)
/lib64/ld-linux-x86-64.so.2 (0x00007fd585816000)
参数
文件:需要使用动态库的可执行程序或者动态库文件
ldd介绍
ldd不是一个可执行程序,而是一个shell脚本。
ldd能够显示可执行模块的依赖,其原理是通过设置一系列的环境变量,如:LD_TRACE_LOADED_OBJECTS、LD_WARN、LD_LIBRARY_VERSION、LD_VERBOSE等,当LD_TRACE_LOADED环境变,任何可执行程序在运行时,都会显示模块的dependency,而程序并不真正执行。
root@68fc0a9bc6dd:/home/wzm/go/src# export LD_TRACE_LOADED_OBJECTS=1
root@68fc0a9bc6dd:/home/wzm/go/src# ls
linux-vdso.so.1 => (0x00007ffe2ad9a000)
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f5a9c6d4000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5a9c30a000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f5a9c09a000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f5a9be96000)
/lib64/ld-linux-x86-64.so.2 (0x00007f5a9c8f6000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f5a9bc79000)
ldd显示可执行模块的依赖的工作原理,其实是通过ld-linux.so(elf动态库的装置器)来实现的。ld-linux.so模块会先于executable模块程序工作,并获得控制权,因此当上述的环境变量被设置时,ld-linux.so选择显示可执行模块的dependency。
也可以直接执行ld-linux.so模块。