Linux ldd和objdump之间有什么区别?

Linux ldd和objdump之间有什么区别?,linux,objdump,ldd,Linux,Objdump,Ldd,我正在运行这两个命令,并得到不同的输出: $ ldd `which ls` linux-gate.so.1 => (0x00db3000) libselinux.so.1 => /lib/i386-linux-gnu/libselinux.so.1 (0x00ba2000) librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0x007bf000) libacl.so.1 => /lib/i386-

我正在运行这两个命令,并得到不同的输出:

$ ldd `which ls`
    linux-gate.so.1 =>  (0x00db3000)
    libselinux.so.1 => /lib/i386-linux-gnu/libselinux.so.1 (0x00ba2000)
    librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0x007bf000)
    libacl.so.1 => /lib/i386-linux-gnu/libacl.so.1 (0x004ce000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00110000)
    libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0x00398000)
    /lib/ld-linux.so.2 (0x00dea000)
    libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0x00a83000)
    libattr.so.1 => /lib/i386-linux-gnu/libattr.so.1 (0x00d3d000)
然后

objdump -x `which ls` | grep NEEDED
  NEEDED               libselinux.so.1
  NEEDED               librt.so.1
  NEEDED               libacl.so.1
  NEEDED               libc.so.6

怎么回事?我以为他们两个都给了图书馆?我关心的原因是我怀疑ldd是正确的,但我正在ARM上的linux上工作,据我所知,那里没有ldd…

您可以看到输出中的差异

objdump只是将对象本身列出的内容转储为包含未解析符号的库

ldd列出了ld.so实际加载的库。它沿着图表向后走,这样你就可以看到那些库会加载什么。这就是libpthread.so.0在ldd输出中结束的方式,尽管它不在objdump输出中


因此,ldd将提供一个非常非常好的图片,说明在运行时真正需要的是什么。但是,在解决编译/链接时问题时,objdump非常有用。

请参阅程序库HOWTO,部分:

注意:不要在你不信任的程序上运行ldd。正如ldd(1)手册中明确指出的,ldd的工作原理是(在某些情况下)设置一个特殊的环境变量(对于ELF对象,LD_TRACE_LOADED_objects),然后执行程序。不受信任的程序可能会强制ldd用户运行任意代码(而不是简单地显示ldd信息)。因此,为了安全起见,不要在不信任执行的程序上使用ldd


这是一个合适的评论,但它不是问题的答案。它太重要了,不能评论。谢谢你的回答。