ldd不适用于动态链接的二进制文件

Man*_*har 14 linux linker shared-libraries elf

我有一个使用一堆.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
Run Code Online (Sandbox Code Playgroud)

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

bash-3.00$ ldd foo
        not a dynamic executable
bash-3.00$
Run Code Online (Sandbox Code Playgroud)

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]
Run Code Online (Sandbox Code Playgroud)

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

小智 6

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


ere*_*nce 5

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

sudo yum install glibc.i686 libgcc.i686 libstdc++.i686 glibc-devel.i686
Run Code Online (Sandbox Code Playgroud)

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

  • 这里(在CentOS7上)只需要`yum install glibc.i686`来使这个工作用于vxworks 6.9`deflate`可执行文件. (2认同)