Descubra se a biblioteca está no caminho

13

Supondo que eu queira testar se uma biblioteca está instalada e utilizável por um programa. Posso usar ldconfig -p | grep mylibpara descobrir se ele está instalado no sistema. mas e se a biblioteca for conhecida apenas por meio de configuração LD_LIBRARY_PATH?

Nesse caso, o programa poderá encontrar a biblioteca, mas ldconfignão o encontrará. Como posso verificar se a biblioteca está no caminho combinado do vinculador?

Acrescentarei que estou procurando uma solução que funcione mesmo que eu não tenha realmente o programa em mãos (por exemplo, o programa ainda não foi compilado), só quero saber que existe uma certa biblioteca em ld' s caminhos.

nbubis
fonte
2
Você pode usar ldd <binary>para verificar se todas as bibliotecas vinculadas estão no caminho. Talvez haja uma maneira mais elegante.
Thomas
@ Thomas Acho que você deve responder o seu comentário. lddserve exatamente a esse propósito.
Lgeorget
1
@ Thomas - mas e se eu o programa ainda não estiver compilado, e essa biblioteca for necessária para a compilação?
Nbubis
@Igeorget - veja minha edição / comentário
nbubis
@ nbubis: quando você precisar da biblioteca para compilação, normalmente precisará usar LIBRARY_PATHa variável de ambiente que é procurada, por exemplo, pelo gcccompilador. A LIBRARY_PATHvariável de ambiente também possui uma lista de diretórios separada por dois pontos.
Thomas

Respostas:

14

ldconfig pode listar todas as bibliotecas às quais tem acesso. Essas bibliotecas também são armazenadas em seu cache.

/sbin/ldconfig -v -Nrastreará todos os caminhos usuais da biblioteca, listará todas as bibliotecas disponíveis, sem reconstruir o cache (o que não é possível se você não for um usuário root). NÃO leva em conta as bibliotecas em LD_LIBRARY_PATH (ao contrário do que este post dizia antes da edição), mas você pode passar bibliotecas adicionais para a linha de comando usando a linha abaixo:

/sbin/ldconfig -N -v $(sed 's/:/ /g' <<< $LD_LIBRARY_PATH)
lgeorget
fonte
O ldconfig é uma ferramenta dos anos 80 que foi abandonada nos anos 90. Por esta razão, ldconfignão é portátil, uma vez que só se aplica a implementações que são baseadas nas SunOS-4,0 a.outvinculador dinâmico base de 1987.
Schily
Como isso ajuda a listar bibliotecas que estão apenas no LD_LIBRARY_PATH? Eu acho que eu poderia escrever um script para analisar isso e depois ler isso através do ldconfig, mas parece um pouco como um extermínio.
Nbubis 10/10
1
@nbubis, você sempre pode passar as bibliotecas em LD_LIBRARY_PATH para o ldconfig. Como /sbin/ldconfig -N -v $(sed 's/:/ /' <<< $LD_LIBRARY_PATH)não exagerar no meu gosto.
Lgeorget #
@schily Sério? Funciona muito bem com as bibliotecas ELF, até onde eu sei. E ainda é usado, o ld.so depende do cache criado pelo ldconfig.
Lgeorget #
O pessoal do Linux invadiu o antigo código-fonte do Sun Linker para dar suporte ao ELF. A nova implementação ELF da Sun foi removida ldconfigem um contrato com a AT&T, pois o cache do vinculador era muito sensível a erros. Sun acrescentou mais tarde the tree stooges: moe, larie crlecomo programas auxiliares para a gestão ELF.
schily 10/05
2

Substitua globalmente (espaço) por :LD_LIBRARY_PATH

/sbin/ldconfig -N -v $(sed 's/:/ /g' <<< $LD_LIBRARY_PATH)
fracassar
fonte
2

Você pode compilar um programa de teste simples com o gcc e vincular sua biblioteca. Depois, você pode verificar as bibliotecas usadas com o ldd. Eu uso algo como isto:

echo "int main(){}" | gcc -x c++ -Wl,--no-as-needed -lmylib - && ldd a.out | grep mylib

-Wl,--no-as-needed impede que o vinculador descarte a biblioteca, porque nenhum símbolo da biblioteca é usado.

guini
fonte