LINUX.ORG.RU

LDD показывает лишнее

 


1

2

LDD показывает бибилиотеки, которые я не подключал - он показывает рекурсивно? В смысле я цепляю А, А цепляет Б -> LDD показывает А и Б? Или что-то тут не так?


Да. И в мане по ldd даже написано, какую команду надо вбить в терминал, чтобы показать не транзитивное замыкание, а только прямые зависимости.

devsdc ★★
()
Ответ на: комментарий от devsdc

Как тогда понять, кто цепляет то, что я не хотел бы цеплять? Гонять ldd -u на тех, кого сейчас показывает ldd без флага?

Edible
() автор топика
Ответ на: комментарий от Edible

Поковырялся в мане, вроде, такое должно работать:

$ LD_TRACE_LOADED_OBJECTS=1 LD_VERBOSE=1 /lib/ld-linux.so.2 /path/to/elf

Ибо ldd делает то же самое, но без LD_VERBOSE. Можно ещё с LD_DEBUG попробовать поиграться, если указанное выше не поможет.

devsdc ★★
()

да, рекурсивно. Если нужно только информацию о бинарнике - используй readelf.
ldd вообще опасно использовать на незнакомых бинарниках к примеру.

mittorn ★★★★★
()
Ответ на: комментарий от devsdc

можно сам линкер не указывать если дефолтный, просто бинарник с указанными переменными запустить.

slapin ★★★★★
()
Ответ на: комментарий от slapin

А, и правда же, они и так через него запускаются. Спасибо, я что-то затупил.

devsdc ★★
()
Ответ на: комментарий от Deleted

man ldd, DESCRIPTION

   Security
       In the usual case, ldd invokes the standard dynamic linker (see ld.so(8))  with
       the  LD_TRACE_LOADED_OBJECTS  environment  variable  set to 1, which causes the
       linker to display the library dependencies.  Be aware, however,  that  in  some
       circumstances, some versions of ldd may attempt to obtain the dependency infor‐
       mation by directly executing the program.  Thus, you should never employ ldd on
       an  untrusted  executable,  since this may result in the execution of arbitrary
       code.

Я там выше в комментариях писал, что ldd просто запускает динамический загрузчик, выставив определенную переменную окружения, указывающую на то, что файл не надо запускать, только показать список загружаемых для запуска библиотек. В некоторых случаях динамический загрузчик может проигнорировать эту переменную и запустить файл, как обычно.

devsdc ★★
()
Ответ на: комментарий от devsdc

спасибо ;)

В некоторых случаях динамический загрузчик может проигнорировать эту переменную и запустить файл, как обычно.

в каких например?

Deleted
()
Ответ на: комментарий от Deleted

Как минимум (и это указано в том куске мана, который я привёл), это может быть динамический загрузчик какой-нибудь старой версии. Или какой-нибудь сторонний загрузчик, не поддерживающий подобный паттерн использования вообще. Или какая-нибудь прослойка (мне не придумывается, как именно это можно сделать, но вдруг) может убирать эту переменную перед запуском динамического загрузчика. Да мало ли ещё чего может случиться.

В принципе, все эти случаи являются исключительными, но мы же говорим о безопасности, которая как раз в основном об обработке исключительных случаев.

devsdc ★★
()
Ответ на: комментарий от devsdc

Отсюда вытекает интересный вопрос, можно ли заюзать ldd для рекурсивного обхода зависимостей? Типа маздайного dependency walker? Может есть другая софтина для этого? А то бывает иногда надо...

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

А какие фичи может dependency walker? Или, скорее, какие фичи от него хочется в линуксах? Никогда им не пользовался, потому не знаю.

Сам ldd — вряд ли, судя по ману, он довольно тупой и мало чего может. А вот подсовывать разные флажки самому ld.so уже более интересно.

Ну и ещё всякие readelf и objdump есть с кучей разных опций, но вряд ли они будут рекурсивно обходить зависимости. Рекурсивный обход требует динамического резолвинга зависимостей, а это работа динамического загрузчика, а не парсеров объектных файлов.

devsdc ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.