«Какой» эквивалент для разделяемых библиотек

9

Я ищу утилиту, которая будет вести себя так же, как which, но искать общие библиотеки (* .so) в каталогах, определенных в $ LD_LIBRARY_PATH?

rahmu
источник

Ответы:

5

Если у вас есть исполняемый файл, и вы хотите увидеть, где он собирает библиотеки, запустите

ldd /path/to/executable

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

В Linux пути к системным библиотекам кэшируются для эффективности. /sbin/ldconfig -pотображает содержимое кеша (он хранится в /etc/ld.so.cache) Вот скрипт, который показывает расположение (я) библиотеки:

#!/bin/sh
if [ -n "$LD_LIBRARY_PATH" ]; then
  set -f
  IFS=:
  for d in $LD_LIBRARY_PATH; do
    if [ -e "$d/$1" ]; then echo "$1"; fi
  done
fi
/sbin/ldconfig -p |
awk -v needle="$1" '$1 == needle {sub(/.* => /, ""); print}'
Жиль "ТАК - перестань быть злым"
источник
5

Если ваши библиотеки правильно кэшированы, вы сможете найти их через:

ldconfig -p|grep "yourlibrary"

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

  • zypper wp "* / library.so" (SLES и OpenSuSE)
  • yum предоставляет "* / library.so" (RedHat и его клоны)

Это также выведет rpms, которые не установлены, но являются частью ваших активных источников установки.

Nils
источник
3

Если вы ищете утилиту , которая будет работать как gcc«S -lLIBNAMEфлаг, который ищет файл с именем , libLIBNAME.soто вы могли бы использовать небольшой скрипт , который делает что - то вроде этого:

#!/bin/sh
ldpath="${LD_LIBRARY_PATH:-$(</etc/ld.so.conf)}"
notfound=1
for libdir in ${ldpath//:/ }; do
        (test -f "$libdir/lib${1}.so" && echo "$_") && notfound=0
done
[ "$notfound" -eq 0 ]
amphetamachine
источник
1
Спасибо за сценарий, но мне действительно интересно, есть ли «стандартная» утилита для этого.
Рахму