23

これら 2 つのコマンドを実行していますが、異なる出力が得られます。

$ 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、それが正しいと思われるからですが、私が知ることができる ldd がない ARM 上の Linux に取り組んでいます...

4

2 に答える 2

24

出力の違いがわかります。

objdump は、オブジェクト自体が未解決のシンボルを含むライブラリとしてリストしているものを単にダンプしています。

ldd は、ld.so が実際にロードするライブラリをリストしています。また、グラフを逆方向にたどるので、これらのライブラリによって何がロードされるかがわかります。libpthread.so.0 が ldd の出力に表示されるのは、objdump の出力に表示されていないにもかかわらずです。

したがって、ldd は、実行時に実際に利用可能にする必要があるものについて、はるかに優れた画像を提供します。ただし、コンパイル/リンク時の問題を解決する場合は、objdump が非常に役立ちます。

于 2012-07-17T14:44:13.590 に答える