Paylaşılan kütüphaneler için “hangi” eşdeğeri


10

Ben de aynı şekilde davranacak bir yardımcı program arıyorum which, ancak $ LD_LIBRARY_PATH tanımlanan dizinlerde paylaşılan kütüphaneler (* .so) aramak için?

Yanıtlar:


5

Yürütülebilir bir dosyanız varsa ve kitaplıkların nereden alındığını görmek istiyorsanız,

ldd /path/to/executable

Bu, varsayılan arama yolundaki kütüphanelerin yanı sıra bu yürütülebilir dosyanın rpath'indeki kütüphaneleri de hesaba katacaktır .

Linux'ta, sistem kitaplıklarına giden yollar verimlilik için önbelleğe alınır. /sbin/ldconfig -pönbellek içeriğini görüntüler (içinde saklanır /etc/ld.so.cache). Kitaplığın konumlarını gösteren bir komut dosyası:

#!/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

Kitaplıklarınız düzgün bir şekilde önbelleğe alınmışsa, onu bulmak için iptal edilmeniz gerekir:

ldconfig -p|grep "yourlibrary"

Dağıtımınızla birlikte gelen bir kitaplığı ararsanız, paketler içindeki dosyaları aramak için dağıtım araçlarını kullanabilirsiniz.

  • zypper wp "* / library.so" (SLES ve OpenSuSE)
  • yum "* / library.so" sağlar (RedHat ve klonları)

Bu, yüklü olmayan ancak etkin yükleme kaynaklarınızın bir parçası olan rpm'leri de çıkarır.


3

Adlı bir dosya arar gcc's -lLIBNAMEbayrağı gibi çalışacak bir yardımcı program arıyorsanız libLIBNAME.so, muhtemelen böyle bir şey yapan küçük bir komut dosyası kullanabilirsiniz:

#!/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 ]

1
Senaryo için teşekkürler ama bunun için "standart" bir yardımcı program olup olmadığını gerçekten merak ediyorum.
rahmu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.