Comando para listar os diretórios nos quais procurar bibliotecas compartilhadas?

3

Li o which equivalente para bibliotecas compartilhadas e Onde os executáveis procuram objetos compartilhados em tempo de execução , mas existe um comando para listar todos os diretórios nos quais as bibliotecas compartilhadas serão ser pesquisado?

Algo como um comando que calcula automaticamente toda a lista explicada na segunda pergunta.

    
por mgarciaisaia 04.09.2016 / 00:30

4 respostas

3

curto: não

long: as variáveis de ambiente relacionadas dependem do sistema e da configuração. Para um determinado sistema / configuração, você poderia escrever um script que faz isso.

Onde os executáveis procuram compartilhada objetos em tempo de execução dão algumas dicas, mas estão incompletos. Menciona o OSX e o Solaris, mas se concentra no Linux, apontando para dois recursos:

Você também acharia isso útil:

Em particular, " sudo ldconfig -v "

-v, --verbose
Verbose mode. Print current version number, the name of each directory as it is scanned, and any links that are created. Overrides quiet mode.

que está perto do que foi perguntado, mas fornece muita informação irrelevante. (E é em grande parte específico do Linux, embora os BSDs o usem - mas diferentes, consulte a página de manual ). Se você fizer algumas suposições sobre o formato de saída, poderá obter diretórios usando

sudo ldconfig -v 2>/dev/null | grep ':$' |sed -e 's/://'

que dá (em um sistema)

/usr/local/lib
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
/lib
/usr/lib

Para recapitular: não existe comando , mas você pode criar um script, que é dependente do sistema.

    
por 06.09.2016 / 10:39
0

Não tenho conhecimento de um comando específico que liste todas as bibliotecas compartilhadas, mas você poderia usar um pouco de uma solução "fudge" apenas executando

which <non-existent command/alias>

e observe a saída como:

[$]› which fake-command
/usr/bin/which: no fake-command in (/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin)

ou encontre qualquer diretório que termine em * bin

find / -name *bin -type d 

mas isso provavelmente trará muitos resultados que não estarão em uma biblioteca compartilhada

    
por 06.09.2016 / 10:24
0

Eu não estou ciente de tal comando. No entanto, /etc/ld.so.conf e possivelmente todos os arquivos em /etc/ld.so.conf.d/ mais o que você encontrar em $LD_LIBRARY_PATH produz a resposta para a pergunta onde as bibliotecas compartilhadas são pesquisadas? .

Cuidado: os executáveis podem definir caminhos de pesquisa adicionais ou alternativos.

Você também pode usar ldd em todos os arquivos no caminho de pesquisa para ver onde o vinculador dinâmico realmente pesquisa. A abordagem a seguir leva um tempo e certamente não é premiada:

ldd /bin/* /usr/bin/* /sbin/* /usr/sbin/* 2>/dev/null | grep '=>' | awk '{print $3;}' | xargs dirname | sort -u
    
por 06.09.2016 / 10:45
0

Em um sistema GNU

ldconfig -p | tail -n +2 | grep -o '/.*/' | sort -u

Daria a você os diretórios onde as bibliotecas dinâmicas são encontradas no cache. Você pode adicionar os em $LD_LIBRARY_PATH . Aqui com a sintaxe zsh :

(
  ldconfig -p | tail -n +2 | grep -o '/.*/'
  [ -n "$LD_LIBRARY_PATH" ] && printf '%s/\n' ${${(s/:/)LD_LIBRARY_PATH}:A}
) | sort -u

Observe também que pelo menos no meu sistema GNU x86_64, e para executáveis de 64 bits, para cada um desses diretórios, ele também procura em $dir/x86_64 , $dir/tls e $dir/tls/x86_64 .

Observe também que os executáveis podem codificar caminhos para bibliotecas neles. Ainda com o vinculador dinâmico GNU, você poderia usar LD_DEBUG=libs para obter os caminhos de busca, por exemplo com algo como (aqui para executáveis ELF de 64 bits no meu sistema GNU / Linux):

$ LD_DEBUG=libs /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 --inhibit-cache /bin/true 2>&1 |
   sed '/.*search path=/!d;s///;s/[[:blank:]]*([^)]*)$//' |
   tr : '\n' |
   sort -u
/home/stephane/lib
/home/stephane/lib/tls
/home/stephane/lib/tls/x86_64
/home/stephane/lib/x86_64
/lib
/lib/tls
/lib/tls/x86_64
/lib/x86_64
/lib/x86_64-linux-gnu
/lib/x86_64-linux-gnu/tls
/lib/x86_64-linux-gnu/tls/x86_64
/lib/x86_64-linux-gnu/x86_64
/usr/lib
/usr/lib/tls
/usr/lib/tls/x86_64
/usr/lib/x86_64
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/tls
/usr/lib/x86_64-linux-gnu/tls/x86_64
/usr/lib/x86_64-linux-gnu/x86_64
    
por 06.09.2016 / 11:02