linux - 获取准确的 ELF 依赖项
问题描述
我知道两种查找依赖项的方法,
ldd app.out
它们会为一个简单的应用程序返回这个:
linux-vdso.so.1 (0x00007ffff93f5000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f02383a0000)
/lib64/ld-linux-x86-64.so.2 (0x00007f0238800000)
并readelf -d app.out | grep NEEDED
返回:
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
我想了解为什么输出差异,libc.so
在这两种情况下,/lib64/ld-linux-x86-64.so.2
都是解释器并且在第一个中是有意义的,但是大约linux-vdso.so.1
?哪个更准确?
解决方案
readelf -d
显示应用程序想要ldd
什么,显示链接器想要什么。
它们是不同的,因为:
ldd
显示依赖关系的传递闭包(即递归),而readelf
仅显示直接依赖关系ldd
显示加载程序,它readelf
考虑与动态依赖项分开ldd
显示虚拟库,这是应用程序不关心的系统实现细节
这意味着哪个更准确取决于您和您的用例。
如果您正在创建 VM 映像并需要复制所有依赖项,则可以使用它,ldd
因为它决定了当前系统运行应用程序所需的内容。如果您正在编写类似 的兼容层wine
,您会使用它,readelf
因为它决定了应用程序需要从主机系统获得什么。
推荐阅读
- scala - 在 Scala/Spark 中获取键/值对的键
- python - pyodbc 中的用户密码与 pyinstaller 无关?
- python - 如何根据熊猫中的特定列值识别数据框中的“子”数据框
- sql - 没有连接条件的 T-SQL 匹配记录 1 到 1
- azure-devops - Azure pilines - 构建 Xamarin.iOS - 未安装 iOS SDK 版本“14.0”,也未找到更新版本
- python - 如何在 Python 中使用正则表达式从文件底部读取 HTML 标记?
- node.js - 如何让这条受保护的路线正常工作?
- html - 为什么在设置背景图像时 background-image 属性需要明确指定 url()
- react-native - Xcode 12 问题:“找不到构建输入文件”- 在反应原生应用程序上构建以发布
- c# - 我需要更改此存在检查以在 User::FileName 上使用通配符