Gostaria de saber quais bibliotecas são usadas pelos executáveis no meu sistema. Mais especificamente, gostaria de classificar quais bibliotecas são mais usadas, juntamente com os binários que as utilizam. Como posso fazer isso?
linux
shared-libraries
Alan Szlosek
fonte
fonte
dlopen
.Respostas:
ldd
para listar bibliotecas compartilhadas para cada executável.Para encontrar a resposta para todos os executáveis no diretório "/ bin":
Altere "/ bin" acima para "/" para pesquisar todos os diretórios.
A saída (apenas para o diretório / bin) será mais ou menos assim:
Editar - Removido "grep -P"
fonte
ldd -v
ldd
realmente executa o executável com uma variável de ambiente especial, e o vinculador dinâmico do Linux reconhece esse sinalizador e apenas gera as bibliotecas em vez de executar o executável. Olhe a fonte paraldd
; no meu sistema, é um script bash. Se o executável estiver estaticamente vinculado e usar syscalls e especificar um carregador diferente, ele poderá fazer coisas arbitrárias. Portanto, não useldd
em um executável em que não confie.Eu não tinha ldd na minha cadeia de ferramentas do ARM, então usei o objdump:
Objdump de $ (CROSS_COMPILE) -p
Por exemplo:
fonte
ldd
que não deve ser usado em executáveis não confiáveis.obbjdump -p
mostra informações adicionais como oRPATH
, que podem ajudar na investigação de problemas de vínculo dinâmico com o seu executável.musl-gcc
produz binários regularmente, de forma que a chamadaldd
no binário apenas executa o binário , então hoje em dia sou regularmente lembrado de quão inseguroldd
é).No Linux eu uso:
Isso funciona melhor do que
ldd
quando o executável usa um carregador não padrãofonte
para aprender quais bibliotecas um binário usa, use ldd
Você teria que escrever um pequeno script de shell para chegar ao seu colapso em todo o sistema.
fonte
Verificar dependências da biblioteca compartilhada de um programa executável
Para descobrir de quais bibliotecas um determinado executável depende, você pode usar o comando ldd. Este comando chama o vinculador dinâmico para descobrir as dependências da biblioteca de um executável.
> $ ldd / caminho / para / programa
Observe que NÃO é recomendável executar o ldd com nenhum executável de terceiros não confiável, porque algumas versões do ldd podem chamar diretamente o executável para identificar suas dependências da biblioteca, o que pode ser um risco à segurança.
Em vez disso, uma maneira mais segura de mostrar dependências da biblioteca de um aplicativo binário desconhecido é usar o seguinte comando.
para mais informações
fonte
readelf -d
recursãoredelf -d
produz uma saída semelhante àobjdump -p
mencionada em: https://stackoverflow.com/a/15520982/895245Mas lembre-se de que as bibliotecas dinâmicas podem depender de outras bibliotecas dinâmicas, para que você precise recursar.
Exemplo:
Saída da amostra:
Então:
Escolha um e repita:
Saída de amostra:
E assim por diante.
/proc/<pid>/maps
para processos em execuçãoIsso é útil para encontrar todas as bibliotecas atualmente sendo usadas executando executáveis. Por exemplo:
mostra todas as dependências dinâmicas atualmente carregadas de
init
(PID1
):Este método também mostra as bibliotecas abertas com
dlopen
, testadas com esta configuração mínima hackeada com umasleep(1000)
no Ubuntu 18.04.Consulte também: /superuser/310199/see-currently-loaded-shared-objects-in-linux/1243089
fonte
No OS X, por padrão, não há
ldd
,objdump
oulsof
. Como alternativa, tenteotool -L
:Neste exemplo, o uso
which openssl
preenche o caminho completo para o ambiente de usuário atual e executável especificado.fonte
No sistema UNIX, suponha que o nome binário (executável) seja test. Em seguida, usamos o seguinte comando para listar as bibliotecas usadas no teste:
fonte
Com
ldd
você pode obter as bibliotecas que as ferramentas usam. Para classificar o uso de bibliotecas para um conjunto de ferramentas, você pode usar algo como o seguinte comando.(Aqui,
sed
retira todas as linhas que não começam com uma guia e os filtros apenas as bibliotecas reais. Comsort | uniq -c
você, cada biblioteca recebe uma contagem indicando o número de vezes que ocorreu.)Você pode adicionar
sort -g
no final para obter as bibliotecas em ordem de uso.Observe que você provavelmente obtém linhas duas linhas não pertencentes à biblioteca com o comando acima. Um dos executáveis estáticos ("não é um executável dinâmico") e outro sem nenhuma biblioteca. O último é o resultado do
linux-gate.so.1
qual não é uma biblioteca no seu sistema de arquivos, mas uma "fornecida" pelo kernel.fonte
Mais uma opção pode ser apenas ler o arquivo localizado em
Por exemplo, se o ID do processo é 2601, o comando é
E a saída é como
fonte
nos pacotes de impressão do ubuntu relacionados a um executável
fonte
Achei este post muito útil, pois precisava investigar dependências de uma biblioteca fornecida por terceiros (caminho (s) de execução de 32 vs 64 bits).
Eu montei um script bash recorrente de Q&D baseado na sugestão 'readelf -d' em uma distro do RHEL 6.
É muito básico e testará todas as dependências todas as vezes, mesmo que possa ter sido testado antes (isto é, muito detalhado). A saída também é muito básica.
redirecionar a saída para um arquivo e grep para 'encontrado' ou 'falhou'
Use e modifique, por sua conta e risco, é claro, como desejar.
fonte