“which” equivalente para bibliotecas compartilhadas

9

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

    
por rahmu 06.10.2011 / 19:08

3 respostas

5

Se você tiver um executável e quiser ver onde ele está pegando as bibliotecas, execute

ldd /path/to/executable

Isso será responsável pelas bibliotecas no caminho de pesquisa padrão, bem como nas bibliotecas do rpath desse executável, se houver.

No Linux, os caminhos para as bibliotecas do sistema são armazenados em cache para maior eficiência. /sbin/ldconfig -p exibe o conteúdo do cache (é armazenado em /etc/ld.so.cache ). Aqui está um script que mostra a localização 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}'
    
por 07.10.2011 / 02:01
4

Se as suas bibliotecas estiverem devidamente armazenadas em cache, você deve ser capaz de encontrá-las via:

ldconfig -p|grep "yourlibrary"

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

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

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

    
por 06.10.2011 / 22:36
3

Se você estiver procurando por um utilitário que funcionará como gcc ' -lLIBNAME flag, que procura um arquivo chamado libLIBNAME.so , provavelmente você poderia usar um pequeno script que faz 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 ]
    
por 06.10.2011 / 21:36