Libtree: `ldd` que explica em forma de árvore se uma biblioteca foi encontrada
(github.com/haampie)- libtree é uma ferramenta que transforma a saída de
lddem uma árvore e explica como bibliotecas compartilhadas foram encontradas ou por que não podem ser localizadas - Na saída padrão, algumas dependências padrão ficam ocultas, e com
-v,-vv,-vvvé possível ver gradualmente as bibliotecas ocultas e até as dependências de bibliotecas já encontradas --pathou-pmostra o caminho em vez do soname, e--max-depthpode limitar a profundidade da busca recursiva- A instalação é possível por meio de binários pré-compilados v3.1.1, Fedora/RHEL/CentOS, Ubuntu 22.04+ e GNU Guix
- Para compilar a partir do código-fonte, é necessário um compilador C com suporte a C99, e ao usar
make,LDFLAGS=-staticé recomendado
O que o libtree faz
- libtree é uma ferramenta que transforma
lddem uma árvore - Explica como bibliotecas compartilhadas são encontradas ou por que sua localização não pode ser determinada
- O README inclui uma captura de tela em
doc/screenshot.png
Opções de saída
- Na saída padrão, algumas dependências padrão não são exibidas
- A saída mais detalhada é controlada por opções de verbosidade
libtree -v: mostra bibliotecas que normalmente são ignoradaslibtree -vv: também mostra as dependências de bibliotecas que normalmente são ignoradaslibtree -vvv: também mostra as dependências de bibliotecas já encontradas
- A flag
--pathou-pmostra o caminho em vez do soname- Exemplo:
libtree -p $(which tar)
- Exemplo:
--max-depthlimita a profundidade da recursão
Como instalar
- Prebuilt binaries for v3.1.1: fornece binários pré-compilados para Linux
- No Fedora / RHEL / CentOS, instale com
dnf- No RHEL e distribuições derivadas, ative primeiro
epel-release dnf install libtree-ldd
- No RHEL e distribuições derivadas, ative primeiro
- No Ubuntu 22.04+, instale com
apt-get install libtree - No GNU Guix, instale com
guix install libtree - Older release v2.0.0 também está disponível
Compilando a partir do código-fonte
libtreerequer um compilador C com suporte a C99- O procedimento básico de compilação é clonar o repositório e depois executar
makegit clone https://github.com/haampie/libtree.gitcd libtreemake
- Ao usar
make,LDFLAGS=-staticé recomendado - O README também fornece, em uma seção recolhível separada, um comando de instalação rápida insegura que baixa
libtree.ccomcurle o compila
2 comentários
Opiniões no Hacker News
Esta ferramenta também replica o comportamento inesperado do
lddde acabar executando de fato parte da biblioteca que está sendo inspecionada?https://catonmat.net/ldd-arbitrary-code-execution
lddcom aproximadamente mais de 5 anos não executam o binário alvoReferência: https://manpages.debian.org/unstable/manpages/ldd.1.en.html#...
Na verdade, parece fazer o parse direto do arquivo ELF e também analisar recursivamente as dependências, o que é bem legal
objdump, ele imprime os dados exatamente como codificados no arquivo ELFInclui até a lista de bibliotecas que o vdso vai procurar
Existe uma ferramenta parecida chamada lddtree
https://github.com/gentoo/pax-utils/tree/master
Ter que rastrear recursivamente dependências faltantes com
lddé bem tediosoEntão isso parece uma boa melhoria, e pretendo usar da próxima vez que encontrar um
not foundambíguoBasicamente, parece uma versão Linux CLI do depends.exe
É melhor usar https://github.com/lucasg/Dependencies. Ela também não está totalmente atualizada, mas…
Se você instalou o Visual Studio e selecionou
x64/x86 build tools (latest)no instalador, executardumpbin /dependentsno VS Developer Command Prompt ainda é a opção mais confiável[1] https://www.dependencywalker.com/
Para quem está curioso sobre o que as cores significam, não encontrei isso na manpage/README
Magenta: está na lista de exclusão, exibido apenas com
-v[v[v]]Azul: item já visto antes, para encontrar dependências que aparecem várias vezes
O que significa “por que uma biblioteca foi encontrada ou não”? Ou ela está em
LD_LIBRARY_PATH, ou não está, certo?Só pela captura de tela, não entendi bem a que isso se refere
Há vários mecanismos diferentes para buscar diretórios, como caminhos de busca do sistema, runpath, rpath,
LD_LIBRARY_PATHetc.Bibliotecas normalmente são vinculadas por um nome curto, como
foo.so, mas também podem ser vinculadas dinamicamente pelo caminho completo da bibliotecaAlém disso, em geral é muito melhor evitar configurar
LD_LIBRARY_PATHquando possível. Nem sempre é possível, mas, ao configurá-lo, ele vai para o topo da prioridade de busca em todas as execuções. Mesmo que algo tenha sido vinculado dinamicamente pelo caminho completo da biblioteca,LD_LIBRARY_PATHtem precedência e acaba achatando completamente o mecanismo de buscaLD_LIBRARY_PATHpara ser encontradaA ideia do título é que o libtree facilita encontrar o caminho de um executável até todas as suas dependências diretas e indiretas. Um dos usos disso é ajudar a entender problemas de dependências ausentes
Na prática, se você usa um sistema de pacotes, provavelmente não verá dependências faltando com frequência, então é mais provável que use o libtree por outros motivos
LD_LIBRARY_PATH”; há também o RPATH, avaliado no momento do carregamento para cada bibliotecaO ponto maior é que dependências formam um grafo, e isso pode ser exibido como uma árvore. É útil saber por causa de qual biblioteca que precisava de outra uma determinada biblioteca não foi encontrada
LD_LIBRARY_PATH. O loader também considera várias outras fontes para encontrá-lasEm uma configuração normal, isso é uma combinação dos campos ELF usuais de cada binário carregado com outros caminhos conhecidos pelo loader
Em sistemas com várias versões da mesma biblioteca ou várias bibliotecas com o mesmo nome, depender de
LD_LIBRARY_PATHpode ser uma visão muito curta. Para cada binário, o loader procura os caminhos deLD_LIBRARY_PATHem ordem e escolhe a primeira biblioteca que corresponde. Se você não tiver definido um caminho de prioridade maior por outro mecanismo, aquela biblioteca pode não ser a que você realmente quer, levando a erros inesperados em runtimeUma abordagem melhor é definir o RPATH do binário para o local onde estão as bibliotecas de que ele precisa
Se o ambiente e a configuração de RPATH não forem consistentes, você pode até carregar várias versões da mesma biblioteca ao mesmo tempo. Esta ferramenta ajuda a descobrir se há problema e por quê
LD_LIBRARY_PATHComo esta ferramenta é baseada em
ldd, ela provavelmente também interpretaDYLD_LIBRARY_PATH,DYLD_FALLBACK_FRAMEWORK_PATH,DYLD_FALLBACK_LIBRARY_PATH,@executable_path,@loader_pathe@rpathMuito útil. Normalmente acabo lendo as seções com
readelfpara descobrir quais são os requisitos reaisLD_DEBUG=libsnão é suficiente?Não sei se é bug, mas no exemplo do vim,
ldde libtree mostram bibliotecas diferentesPor exemplo,
linux-vdso.so.1aparece no topo da lista noldd, mas não aparece em lugar nenhum no libtreelinux-vdso.so.1não é uma biblioteca real que você possa encontrar em algum lugar no sistema de arquivos e também não é referenciada dentro do arquivo ELF, então o libtree não consegue saber delaEm vez disso, o kernel a mapeia automaticamente no espaço de endereçamento de um processo recém-iniciado. É uma otimização para evitar o overhead de chamadas de sistema em funções como
gettimeofday. Referência: https://man7.org/linux/man-pages/man7/vdso.7.htmlCerta vez fiz um scriptzinho bagunçado que rodava
lddrecursivamente para descobrir o que eu precisava incluir para executar binários de código fechado no NixOSSe eu tiver que fazer isso de novo, pretendo experimentar esta ferramenta
Parece muito bom!!