获取准确的 ELF 依赖项
Get accurate ELF dependencies
我知道两种查找依赖项的方法,
ldd app.out
其中 returns 这是一个简单的应用程序:
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
其中 returns:
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
因为它决定了应用程序需要从主机系统获得什么。
我知道两种查找依赖项的方法,
ldd app.out
其中 returns 这是一个简单的应用程序:
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
其中 returns:
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
因为它决定了应用程序需要从主机系统获得什么。