В чем разница между ldd и objdump?

Я запускаю эти две команды, и у меня получается другой вывод:

$ 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 является правильным, но я работаю над linux на ARM, где нет ldd из того, что я могу сказать...

Ответ 1

Вы можете видеть разницу в выходе.

objdump просто сбрасывает то, что сам объект перечисляет, как библиотеки, содержащие неразрешенные символы.

ldd перечисляет, какие библиотеки ld.so действительно загружат. И это следует за графиком назад, чтобы вы могли видеть, что будет загружено этими библиотеками. Вот как работает libpthread.so.0 на выходе ldd, несмотря на то, что он не находится в выводе objdump.

Итак, ldd собирается дать гораздо лучшую картину того, что действительно должно быть доступно во время выполнения. Но при решении проблем с компиляцией/временем ссылки objdump очень полезен.

Ответ 2

См. Библиотека программ HOWTO, раздел 3.5. Установка и использование общей библиотеки:

Остерегайтесь: не запускайте ldd в программе, которой вы не доверяете. Как четко указано в руководстве ldd (1), ldd работает (в некоторых случаях), устанавливая специальную переменную среды (для объектов ELF, LD_TRACE_LOADED_OBJECTS), а затем выполняет программу. Возможно, ненадежная программа заставит пользователя ldd запускать произвольный код (вместо простого отображения информации ldd). Итак, ради безопасности, не используйте ldd для программ, которым вы не доверяете, чтобы выполнить.