linux的so命令,每天一个 Linux 命令(67): ldd 命令

原标题:每天一个 Linux 命令(67): ldd 命令

ldd 命令用于打印程序或者共享库文件所依赖的共享库列表。

注意,ldd 本身不是一个二进制程序,而是一个 Shell 脚本,使用文本编辑器 vim 可以查看其内容,具体目录可以使用 which 命令查看:

whichldd

/usr/bin/ldd

我们知道,Linux 的动态库装载器 ld-linux.so 模块会先于 executable 模块工作,并获得控制权,ld-linux.so 会通过系统环境变量的设置,选择只显示可执行模块的dependency,而不运行可执行模块。

相关环境变量有:

LD_TRACE_LOADED_OBJECTS

LD_WARN

LD_BIND_NOW

LD_LIBRARY_VERSION

LD_VERBOSE

LD_DEBUG

ldd 默认开启的环境变量是:LD_TRACE_LOADED_OBJECTS=1。

也就是说,LD_TRACE_LOADED_OBJECTS为必要环境变量,其他环境变量的设置是可选的。

其他的变量的设置与ldd命令选项的对应关系如下:

-d, --data-relocs -> LD_WARN=yes

-r, --function-relocs ->LD_WARN和LD_BIND_NOW=yes

-u, --unused -> LD_DEBUG="unused"

-v, --verbose -> LD_VERBOSE=yes

比如设置LD_TRACE_LOADED_OBJECTS环境变量不为空时,任何可执行程序在运行时,都会只显示依赖的动态库,程序并不真正地执行。

测试如下:

export LD_TRACE_LOADED_OBJECTS= 1

ls

linux-vdso.so .1=> ( 0x00007ffd1d3cf000)

/$LIB/libonion.so => /lib64/libonion.so ( 0x00007fbbe7162000)

libselinux.so .1=> /lib64/libselinux.so .1( 0x00007fbbe6e2e000)

libcap.so .2=> /lib64/libcap.so .2( 0x00007fbbe6c29000)

libacl.so .1=> /lib64/libacl.so .1( 0x00007fbbe6a20000)

libc.so .6=> /lib64/libc.so .6( 0x00007fbbe665e000)

libdl.so .2=> /lib64/libdl.so .2( 0x00007fbbe645a000)

libpthread.so .0=> /lib64/libpthread.so .0( 0x00007fbbe623e000)

libpcre.so .1=> /lib64/libpcre.so .1( 0x00007fbbe5fdd000)

liblzma.so .5=> /lib64/liblzma.so .5( 0x00007fbbe5db8000)

/lib64/ld-linux-x86 -64.so .2( 0x00007fbbe7053000)

libattr.so .1=> /lib64/libattr.so .1( 0x00007fbbe5bb3000)

撤销该环境变量,ls 即可恢复正常使用:

unsetLD_TRACE_LOADED_OBJECTS

ls

ChangelogChangelog.lndablelvtxt.txt

由此可见,ldd 命令其实是通过设置 ld-linux.so 依赖的环境变量来影响 ld-linux.so的工作方式,使得可执行模块加载时显示其依赖的动态库。

实际上可以直接执行 ld-linux.so 模块,如/lib/ld-linux.so.2 --list program,来达到命令ldd program的效果。

ldd[OPTIONS]< FILES>

其中[OPTIONS]为可选的命令选项,...为必填的程序或者共享库文件列表。

--version:打印ldd版本号

-v, --verbose:详细信息模式,打印所有相关信息

-u, --unused:打印未使用的直接依赖

-d, --data-relocs:执行重定位和报告任何丢失的对象

-r, --function-relocs:执行数据对象和函数的重定位,并且报告任何丢失的对象和函数。(只对ELF格式文件有效)

--help:显示帮助信息

4.示例说明

(1)显示可执行文件依赖的动态链接库。返回搜狐,查看更多

ldd /usr/bin/ls

linux-vdso.so .1=> ( 0x00007ffd90514000)

/$LIB/libonion.so => /lib64/libonion.so ( 0x00007f294ade8000)

libselinux.so .1=> /lib64/libselinux.so .1( 0x00007f294aab4000)

libcap.so .2=> /lib64/libcap.so .2( 0x00007f294a8af000)

libacl.so .1=> /lib64/libacl.so .1( 0x00007f294a6a6000)

libc.so .6=> /lib64/libc.so .6( 0x00007f294a2e4000)

libdl.so .2=> /lib64/libdl.so .2( 0x00007f294a0e0000)

libpthread.so .0=> /lib64/libpthread.so .0( 0x00007f2949ec4000)

libpcre.so .1=> /lib64/libpcre.so .1( 0x00007f2949c63000)

liblzma.so .5=> /lib64/liblzma.so .5( 0x00007f2949a3e000)

/lib64/ld-linux-x86 -64.so .2( 0x00007f294acd9000)

libattr.so .1=> /lib64/libattr.so .1( 0x00007f2949839000)

责任编辑:

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值