В чем разница между 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...


person Alex    schedule 17.07.2012    source источник


Ответы (2)


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

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

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

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

person Aubrey_Jones    schedule 17.07.2012

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

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

person vvv    schedule 10.12.2015
comment
Это годится в качестве комментария, но не является ответом на вопрос. - person Neil Masson; 10.12.2015
comment
Это слишком важно для комментариев. Спасибо за этот ответ. - person puchu; 03.01.2020