【问题标题】:ldd doesn't work on dynamically linked binaryldd 不适用于动态链接的二进制文件
【发布时间】:2013-05-24 08:09:24
【问题描述】:

我有一个使用一堆 .so 文件的二进制文件。

bash-3.00$ file foo
foo: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.21, dynamically linked (uses shared libs), not stripped

但是如果我在这个文件上运行 ldd,它就无法获取二进制文件所依赖的 .so 文件。'

bash-3.00$ ldd foo
        not a dynamic executable
bash-3.00$

readelf 确实显示了二进制文件使用的共享库列表..

bash-3.00$ readelf -d  foo
Dynamic segment at offset 0x17c810 contains 70 entries:

  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [libdl.so.2]

为什么在这种情况下 ldd 无法获取库依赖项?

【问题讨论】:

  • 您可能在 64 位环境中。安装 32 位兼容性库应该可以解决此问题。
  • 谢谢。就是这样。在 ubuntu 中,我能够安装 ia32-libs 并且 ldd 工作。但是在 RedHat 中似乎没有快速简便的方法来安装 32 位兼容性库。

标签: linux linker shared-libraries elf


【解决方案1】:

就像其中一条评论所说的那样 - 您尝试在 64 位系统上使用 ldd 来检查 32 位 ELF 对象。 ldd 使用标准动态链接器来跟踪依赖关系,因此如果您的平台没有被检查的 ELF 对象所需的链接器,ldd 将失败。 Readelf 和 objdump 在这些情况下更加健壮。

【讨论】:

    【解决方案2】:

    请注意,在 Fedora 21 中,要让 ldd 识别 32 位 .so 文件,我必须安装以下内容:

    sudo yum install glibc.i686 libgcc.i686 libstdc++.i686 glibc-devel.i686
    

    我不确定哪一个修复了我在 ldd 中看到的“不是动态可执行文件”错误。

    【讨论】:

    • 这里(在 CentOS7 上)只需要 yum install glibc.i686 来使 vxworks 6.9 deflate 可执行文件工作。
    猜你喜欢
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    • 2012-12-08
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多