获得准确的ELF依赖项

问题描述 投票:0回答:1

我知道找到依赖项的两种方法,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?哪一个更准确?

linux process linux-kernel elf ldd
1个回答
0
投票

[readelf -d显示应用程序需要什么,ldd显示链接器需要什么。

它们之所以不同是因为:

  • [ldd显示依赖关系的传递闭包(即,递归),而readelf仅显示直接依赖关系
  • [ldd显示加载程序,readelf认为是与动态依赖项分开的加载程序
  • [ldd显示虚拟库,这是应用程序不关心的系统实现细节

这意味着更准确取决于您和您的用例。

[如果要创建VM映像并需要复制所有依赖项,则应使用ldd,因为它确定了当前系统运行该应用程序所需的内容。如果要编写诸如wine之类的兼容层,则应使用readelf,因为它确定了主机系统中应用程序的需求。

© www.soinside.com 2019 - 2024. All rights reserved.