每天回顾linux命令(ldd)

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模块。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值