ldd和objdump有什么区别?(这是一个提问标题)

25

我运行这两个命令,但是得到的输出不同:

$ 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个回答

26

您可以看到输出结果的差异。

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

ldd列出了ld.so实际要加载哪些库。它向后跟随图形,这样您就可以看到由那些库加载了什么。这就是为什么libpthread.so.0会出现在ldd输出中,尽管它不在objdump输出中的原因。

因此,ldd将在运行时给出一个更好的真实需求视图。但是,在解决编译/链接时问题时,objdump非常有帮助。


0
请参阅程序库 HOWTO,第3.5. 安装和使用共享库节:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接