„Który” odpowiednik bibliotek współdzielonych

9

Szukam narzędzia, które zachowałoby się w taki sam sposób which, ale by szukać bibliotek współdzielonych (* .so) w katalogach zdefiniowanych w $ LD_LIBRARY_PATH?

rahmu
źródło

Odpowiedzi:

5

Jeśli masz plik wykonywalny i chcesz zobaczyć, gdzie pobiera biblioteki, uruchom

ldd /path/to/executable

Będzie to stanowić dla bibliotek w domyślnej ścieżce wyszukiwania, a także bibliotek w tym wykonywalnego rPath jeśli występują.

W systemie Linux ścieżki do bibliotek systemowych są buforowane w celu zwiększenia wydajności. /sbin/ldconfig -pwyświetla zawartość pamięci podręcznej (jest przechowywana w /etc/ld.so.cache). Oto skrypt, który pokazuje lokalizację biblioteki:

#!/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}'
Gilles „SO- przestań być zły”
źródło
5

Jeśli twoje biblioteki są odpowiednio buforowane, powinieneś być w stanie je znaleźć poprzez:

ldconfig -p|grep "yourlibrary"

Jeśli szukasz biblioteki dostarczonej z dystrybucją, możesz skorzystać ze środków dystrybucji do wyszukiwania plików w pakietach.

  • zypper wp "* / library.so" (SLES i OpenSuSE)
  • yum zapewnia „* / library.so” (RedHat i jego klony)

Spowoduje to również wyświetlenie rpms, które nie są zainstalowane, ale są częścią aktywnych źródeł instalacji.

Nils
źródło
3

Jeśli szukasz narzędzia, które będą działać jak gcc„s -lLIBNAMEflagi, która szuka pliku o nazwie libLIBNAME.sonastępnie prawdopodobnie można użyć trochę skrypt, który robi coś takiego:

#!/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 ]
amfetamachina
źródło
1
Dzięki za skrypt, ale naprawdę zastanawiam się, czy jest do tego „standardowe” narzędzie.
rahmu