Existe uma maneira de determinar quais pacotes ou bibliotecas devem ser carregados para dar suporte a um executável?

11

Há um executável que quero instalar em um computador que não consigo recompilar que não foi construído como um pacote e quero fazer o download das bibliotecas necessárias para executá-las.

Abaixo está parte da saída da execução lddnele

libpango-1.0.so.0 => /usr/lib/i386-linux-gnu/libpango-1.0.so.0 (0xb702f000)
libcairo.so.2 => /usr/lib/i386-linux-gnu/libcairo.so.2 (0xb6f64000)
libatk-1.0.so.0 => /usr/lib/i386-linux-gnu/libatk-1.0.so.0 (0xb6f43000)
libsqlite3.so.0 => /usr/lib/i386-linux-gnu/libsqlite3.so.0 (0xb6e9e000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb6cf4000)
/lib/ld-linux.so.2 (0xb786e000)
libxcb.so.1 => /usr/lib/i386-linux-gnu/libxcb.so.1 (0xb6cd3000)
libgio-2.0.so.0 => /usr/lib/i386-linux-gnu/libgio-2.0.so.0 (0xb6b7c000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb6b4f000)

Existe uma ferramenta que possa usar essas informações para selecionar quais pacotes devem ser baixados ou, melhor ainda, extrair apenas as bibliotecas listadas e suas dependências, a fim de minimizar o uso do disco? O sistema está sendo executado em uma VM sem cabeça e o programa será exibido via VNC.

Embora eu suspeite que uma área de trabalho gráfica completa forneça a maioria das bibliotecas necessárias, desejo fazer o download apenas das bibliotecas necessárias, de suas dependências e do pacote X Windows suficiente para suportá-las.

vfclists
fonte
1
Qual SO? Os pacotes e seus nomes, bem como o gerenciador de pacotes, mudam entre distribuições (e isso pressupõe que você esteja executando algum tipo de Linux).
terdon
É Debian e Ubuntu neste caso
vfclists
Nesse caso, minha resposta deve funcionar para você.
terdon
Na verdade, estou prestes a testá-lo, tardiamente. Eu simplesmente esqueci e apenas fiz uma pergunta semelhante que fez com que essa
aparecesse

Respostas:

14

Você não disse qual sistema operacional está usando, portanto, assumirei o Linux e utilizarei o Debian como exemplo. A resposta rápida para sua pergunta não é tanto quanto eu sei. Essa pode ser uma solução útil:

ldd your_prog | awk '{print $1}' | sed 's/\..*//' | 
  while read n; do echo "----- $n ----"; apt-cache search ^$n; done

Isso analisará a lddsaída e executará apt-cache(substitua-a pelo equivalente ao seu sistema operacional) para procurar nos repositórios por pacotes cujo nome e descrição contenham a primeira parte do nome da biblioteca retornada por ldd.

Isso não encontrará todos eles e fornecerá muitos resultados para alguns (como libc), mas pode ser útil.


@FaheemMitha apontou que apt-filepode ser uma maneira melhor. Por exemplo:

ldd /bin/bash | awk '/=>/{print $(NF-1)}'  | 
 while read n; do apt-file search $n; done |
  awk '{print $1}' | sed 's/://' | sort | uniq

Isso retornará uma lista de nomes de pacotes que fornecem as bibliotecas vinculadas.

terdon
fonte
1
apt-file searchno arquivo real no lado direito da seta pode ser mais eficaz.
Faheem Mitha
@FaheemMitha ponto muito bom, obrigado. Resposta editada.
terdon
Como o comando pode ser ajustado para testar a existência da biblioteca no sistema para encontrar aqueles que precisam ser baixados? Eu acho que a pergunta que fiz recentemente é mais nessa linha. Estou pedindo que seja reaberto.
precisa
O @vfclists não vale a pena, apenas apt-get installtodos eles e todos os que já estão instalados serão ignorados.
terdon
O motivo é criar uma VM sem bibliotecas supérfluas para downloads rápidos. A instalação de pacotes contém muitos itens desnecessários e eu só preciso dos arquivos da biblioteca e de suas dependências exigidas pelos executáveis. Isso também me dá a chance de aprimorar minhas habilidades no bash e no Linux. Sem python.
vfclists
3

A resposta do @ terdon é ótima, mas é ainda mais fácil fazer isso usando o dpkg-querydiferente do que apt-fileé instalado por padrão nos sistemas Debian.

ldd /bin/bash | awk '/=>/{print $(NF-1)}' | while read n; do dpkg-query -S $n; done | sed 's/^\([^:]\+\):.*$/\1/' | uniq

Isso produz uma lista de pacotes.

jcoffland
fonte
1

Sua melhor aposta é encontrar um pacote que realmente suporte sua distribuição. Mas se isso não funcionar para você, conheço apenas uma outra maneira.

Execute o ldd como você possui e instale manualmente essas dependências.

Por exemplo libpango-1.0.so.0 => /usr/lib/i386-linux-gnu/libpango-1.0.so.0 (0xb702f000)

Para mim, significaria instalar apt-get install libpango:i386e rezar para que a versão no Debian instável fosse boa o suficiente.

Você precisaria passar por cada linha de ldd, Google, procurar em seus repositórios disponíveis e basicamente ter sorte. Em seguida, instale-os um por um. Até o programa realmente ser executado. Embora o ldd funcione apenas para programas "simples". Programas que chamam plugins ou que executam código arbitrário são uma questão diferente. Para aqueles que você precisará executar no console e corrigir as falhas / erros à medida que eles acontecem.

Dito isto, um único executável binário é terrivelmente difícil de manter. Você pode considerar usar outra coisa. Se sua distribuição estiver um pouco à frente, ou um pouco atrás do sistema que construiu esse executável, você nunca poderá fazê-la funcionar.

coteyr
fonte