1.命令简介
ldd 命令用于打印程序或者共享库文件所依赖的共享库列表。注意,ldd 本身不是一个二进制程序,而是一个 shell 脚本,使用文本编辑器 vim 可以查看其内容,具体目录可以使用 which 命令查看:
which ldd/usr/bin/ldd 我们知道,linux 的动态库装载器 ld-linux.so 模块会先于 executable 模块工作,并获得控制权,ld-linux.so 会通过系统环境变量的设置,选择只显示可执行模块的dependency,而不运行可执行模块。相关环境变量有:
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=1ls 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 即可恢复正常使用:
unset ld_trace_loaded_objectslschangelog changelog.ln dablelv txt.txt 由此可见,ldd 命令其实是通过设置 ld-linux.so 依赖的环境变量来影响 ld-linux.so的工作方式,使得可执行模块加载时显示其依赖的动态库。实际上可以直接执行 ld-linux.so 模块,如/lib/ld-linux.so.2 --list program,来达到命令ldd program的效果。
2.命令格式 ldd [options] 其中[options]为可选的命令选项,...为必填的程序或者共享库文件列表。
3.选项说明 --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) 参考文献 [1] ldd manual
[2] linux命令大全.ldd命令
[3] 博客园.ldd命令
原文标题:每天一个 linux 命令(103):ldd 命令
文章出处:【微信公众号:linux爱好者】欢迎添加关注!文章转载请注明出处。
坚持经典的黑莓手机,真的不适应这个时代了吗
NVIDIA为HPC和AI加强超级芯片工程
基于Tricore的CANFD入门工程
LCD显示模式与偏光片介绍
中国“龙芯”在航天、车载、3D打印机上的应用
ldd命令:用于打印程序或者共享库文件所依赖的共享库列表
MWC大会上最受关注的四家企业:微软、HTC上榜
光纤传输的工作原理和应用优缺点
QLC 全闪存将取代混合存储?
三星Galaxy S10曝光在进行自拍的时候会触发特效周围会发光
中国力量正以史无前例的参与度推动这场大变革的发展
实施APS排产系统的步骤有哪些?
智能穿戴设备无线充电接收解决方法图解
睿熙科技:全系列VCSEL芯片量产就绪
智能电表盗窃电能风波频起 双向互动成第三只眼
普源示波器测量中的相位校正
高速图像传感器(ARX3A0)实现用于视觉和人工智能的智能视觉系统
AI训练数据服务企业海天瑞声发布2022第一季度报告
如何利用爱普生超一体机把多页文档扫描制作成一个PDF文件?
语音识别技术是什么_语音识别技术应用领域介绍