"Qual" equivalente para bibliotecas compartilhadas

9

Estou procurando um utilitário que se comporte da mesma maneira que which, mas procure bibliotecas compartilhadas (* .so) nos diretórios definidos em $ LD_LIBRARY_PATH?

rahmu
fonte

Respostas:

5

Se você tem um executável e deseja ver onde ele está pegando bibliotecas, execute

ldd /path/to/executable

Isso considerará as bibliotecas no caminho de pesquisa padrão, bem como as bibliotecas no rpath deste executável, se houver.

No Linux, os caminhos para as bibliotecas do sistema são armazenados em cache para maior eficiência. /sbin/ldconfig -pexibe o conteúdo do cache (ele está armazenado /etc/ld.so.cache). Aqui está um script que mostra os locais de uma biblioteca:

#!/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- parar de ser mau'
fonte
5

Se suas bibliotecas estiverem armazenadas em cache corretamente, você poderá encontrá-las através de:

ldconfig -p|grep "yourlibrary"

Se você procurar uma biblioteca que acompanha sua distribuição, poderá usar os meios de distribuição para procurar arquivos nos pacotes.

  • zypper wp "* / library.so" (SLES e OpenSuSE)
  • O yum fornece "* / library.so" (RedHat e seus clones)

Isso também produzirá rpms que não estão instalados, mas fazem parte das fontes de instalação ativas.

Nils
fonte
3

Se você estiver procurando por um utilitário que funcione como gcco -lLIBNAMEsinalizador, que procura um arquivo chamado libLIBNAME.so, provavelmente você pode usar um pequeno script que faça algo assim:

#!/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 ]
anfetamaquina
fonte
11
Obrigado pelo script, mas estou realmente me perguntando se existe um utilitário "padrão" para isso.
rahmu