【问题标题】:What is the difference between ldd and objdump?ldd 和 objdump 有什么区别?
【发布时间】:2012-07-16 12:16:30
【问题描述】:

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

$ 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...

【问题讨论】:

    标签: linux objdump ldd


    【解决方案1】:

    参见程序库 HOWTO,3.5. Installing and Using a Shared Library 部分:

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

    【讨论】:

    • 这适合作为评论,但不是问题的答案。
    • 评论太重要了。谢谢你的回答。
    【解决方案2】:

    你可以看到输出的不同。

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

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

    所以 ldd 将更好地描述运行时真正需要可用的内容。但是,在解决编译/链接时问题时,objdump 非常有用。

    【讨论】:

      猜你喜欢
      • 2011-11-05
      • 1970-01-01
      • 2020-08-16
      • 2010-10-02
      • 2011-12-12
      • 2010-09-16
      • 2012-03-14
      • 2012-02-06
      • 2011-02-25
      相关资源
      最近更新 更多