命令属于哪个软件包,以及这个软件包包含哪些文件
一、确认命令路径
先确认 lastb 实际对应的二进制文件:
which lastb
一般会得到类似:
/usr/bin/lastb
二、查这个文件属于哪个 RPM 包
Rocky Linux 基于 RPM,所以核心命令是:
rpm -qf /usr/bin/lastb
输出类似:
util-linux-2.37.4-...
👉 说明:lastb 是 util-linux 这个包提供的。
三、查看这个包包含哪些文件(核心步骤)
rpm -ql util-linux
你会看到一大堆文件,例如:
-
/usr/bin/last -
/usr/bin/lastb -
/usr/bin/dmesg -
/usr/bin/mount -
/usr/lib/... -
/usr/share/man/...
👉 这一步就是你要的“命令由哪些文件组成”的完整答案(从包维度)
四、只筛选与该命令相关的文件(更精准)
rpm -ql util-linux | grep last
可能输出:
/usr/bin/last
/usr/bin/lastb
/usr/share/man/man1/last.1.gz
/usr/share/man/man1/lastb.1.gz
/usr/bin/lastb
/usr/share/man/man1/last.1.gz
/usr/share/man/man1/lastb.1.gz
👉 这就是 lastb 相关的:
-
可执行文件
-
man 手册
-
相关命令
五、查看命令依赖(进阶分析)
如果你想看 lastb 运行依赖哪些库:
ldd /usr/bin/lastb
会显示:
-
libc
-
libaudit
-
等动态库
👉 这属于“运行时组成”
六、查看源码来源(更底层)
rpm -qi util-linux
可以看到:
-
项目主页
-
描述
-
版本信息
lastb 本质来自:
👉 util-linux
总结(关键逻辑)
在 Linux(尤其是 RPM 系)中:
命令 ≠ 单一文件,而是属于一个软件包(package)
所以分析路径是:
命令 → 二进制路径 → RPM包 → 包内文件列表
给你一个一键命令(实用)
rpm -ql $(rpm -qf $(which lastb))
👉 一步直接列出所有相关文件
yxbinghe
ldd 是 Linux 下做动态链接分析的核心工具,用来查看一个可执行文件在运行时依赖哪些共享库(.so)。
在 Rocky Linux 这类基于 RPM 的系统里,它对排查运行问题、缺库问题、环境冲突非常关键。
一、ldd 是干什么的(本质)
一句话总结:
列出一个 ELF 可执行文件的“动态依赖库”
也就是:程序运行时需要加载哪些 .so 文件。
二、基础用法
ldd /usr/bin/lastb
示例输出(简化):
linux-vdso.so.1 => (0x00007ffc…)
libc.so.6 => /lib64/libc.so.6 (0x00007f…)
libaudit.so.1 => /lib64/libaudit.so.1 (0x00007f…)
/lib64/ld-linux-x86-64.so.2 (0x00007f…)
三、输出字段详解(重点)
1️⃣ libc.so.6 => /lib64/libc.so.6
左边:逻辑库名
右边:实际加载路径
👉 说明系统最终加载的是哪个文件
2️⃣ (0x00007f…)
👉 内存加载地址(运行时映射地址)
3️⃣ linux-vdso.so.1
👉 虚拟动态共享对象(内核提供,不是磁盘文件)
4️⃣ /lib64/ld-linux-x86-64.so.2
👉 动态链接器(loader),负责加载所有 .so
四、最常见的实际用途(非常重要)
1️⃣ 排查“缺库”问题
ldd your_binary | grep “not found”
示例:
libssl.so.1.1 => not found
👉 说明程序跑不起来的原因已经找到了
2️⃣ 判断程序是否能运行
如果所有库都能解析:
✔ 程序“理论上”可以启动
3️⃣ 分析依赖链(运维 / 安全)
比如你可以看到:
是否依赖 libcrypto
是否依赖 libpthread
是否调用系统审计库(libaudit)
4️⃣ 容器 / 最小系统裁剪
你可以用 ldd 提取运行所需最小依赖:
ldd myapp | awk ‘{print $3}’
👉 用于构建精简镜像(常见于 Docker)
五、ldd 的工作原理(进阶)
本质上:
ldd ≈ 调用动态链接器 + 环境变量 trick
它内部依赖:
👉 /lib64/ld-linux-x86-64.so.2
通过环境变量:
LD_TRACE_LOADED_OBJECTS=1
等效执行:
LD_TRACE_LOADED_OBJECTS=1 ./your_binary
六、重要安全注意 ⚠️
👉 不要对不可信的二进制直接运行 ldd
原因:
某些恶意程序会在“被分析时执行代码”
ldd 可能触发 ELF 的初始化逻辑
安全替代方案:
objdump -p your_binary | grep NEEDED
或:
readelf -d your_binary
👉 只做静态分析,不执行代码
七、典型组合命令(实战推荐)
✔ 查看依赖 + 来源包
ldd /usr/bin/lastb | awk ‘{print $3}’ | xargs rpm -qf
👉 直接看到:
每个 .so 属于哪个 RPM 包
✔ 找出未解析依赖
ldd your_binary | grep “not found”
✔ 查看依赖树(更强工具)
建议配合:
repoquery –requires util-linux
八、总结(工程视角)
ldd 解决的是:
“程序运行时需要什么?”
而:
工具 解决问题
rpm -ql 包里有什么
ldd 程序运行依赖什么
which 命令在哪
readelf ELF结构
九、给你一个运维级理解
以 lastb 为例:
rpm -ql → 它属于哪个包
ldd → 它运行需要哪些库
/var/log/btmp → 它读的数据源
👉 三层:
文件归属 → 运行依赖 → 数据来源