Вопрос по objdump, ldd, linux – В чем разница между ldd и objdump?

17

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

$ 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, где нет ничего от того, что я могу сказать ...

Ваш Ответ

2   ответа
1

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

Beware: do not run ldd on a program you don't trust. As is clearly stated in the ldd(1) manual, ldd works by (in certain cases) by setting a special environment variable (for ELF objects, LD_TRACE_LOADED_OBJECTS) and then executing the program. It may be possible for an untrusted program to force the ldd user to run arbitrary code (instead of simply showing the ldd information). So, for safety's sake, don't use ldd on programs you don't trust to execute.

Это подходит как комментарий, но это не ответ на вопрос.
17

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

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

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

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

Похожие вопросы