【问题标题】:Get accurate ELF dependencies获取准确的 ELF 依赖项
【发布时间】:2020-05-15 17:25:36
【问题描述】:

我知道两种查找依赖项的方法, 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】:

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

    它们不同是因为:

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

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

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

    【讨论】:

    • 感谢详细解答
    猜你喜欢
    • 2010-10-27
    • 2022-07-08
    • 2016-10-24
    • 2021-12-10
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    相关资源
    最近更新 更多