获取准确的 ELF 依赖关系

Mel*_*lez 2 linux process elf linux-kernel ldd

我知道两种查找依赖项的方法, 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)
Run Code Online (Sandbox Code Playgroud)

readelf -d app.out | grep NEEDED返回:

0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
Run Code Online (Sandbox Code Playgroud)

我想了解为什么输出差异libc.so在两种情况下都是/lib64/ld-linux-x86-64.so.2解释器并且在第一个中是有意义的,但是关于linux-vdso.so.1?哪一个更准确?

tha*_*guy 7

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

它们之所以不同,是因为:

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

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

如果您正在创建 VM 映像并需要复制所有依赖项,则可以使用它,ldd因为它决定了当前系统运行应用程序所需的内容。如果您正在编写类似的兼容性层wine,您将使用它readelf,因为它决定了应用程序需要主机系统提供什么。