ldd和objdump有什么区别?

时间:2012-07-17 14:33:15

标签: 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-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 ......

2 个答案:

答案 0 :(得分:17)

您可以看到输出的差异。

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

ldd列出了ld.so实际加载的库。它向后跟随图表,以便您可以看到那些库将加载的内容。这是libpthread.so.0在ldd输出中的结果,尽管不在objdump输出中。

因此,ldd将为运行时真正需要的内容提供更好,更好的图片。但是,在解决编译/链接时问题时,objdump非常有用。

答案 1 :(得分:1)

请参阅计划库HOWTO ,第3.5. Installing and Using a Shared Library部分:

  

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