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

10

Existe um executável que quero instalar em um computador que não posso recompilar e que não foi compilado como um pacote, e quero fazer o download das bibliotecas necessárias para executá-las.

Abaixo está parte da saída da execução de ldd

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 pode 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çalho 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, eu quero baixar apenas as bibliotecas necessárias, suas dependências e apenas o suficiente do pacote X Windows para suportá-lo.

    
por vfclists 19.11.2013 / 22:05

3 respostas

14

Você não disse qual sistema operacional está usando, então vou assumir o Linux e usar o Debian como exemplo. A resposta rápida à sua pergunta não é tanto quanto eu sei. Esta 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 ldd output e, em seguida, executará apt-cache (substitua isso pelo equivalente ao seu SO) 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 dará muitos resultados para alguns (como libc ), mas pode ser útil.

@FaheemMitha apontou que apt-file pode ser o melhor caminho. 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.

    
por 19.11.2013 / 23:15
2

A resposta de @ terdon é ótima, mas é ainda mais fácil fazer isso usando dpkg-query , o que, ao contrário de 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/^\([^:]\+\):.*$//' | uniq

Isso produz uma lista de pacotes.

    
por 19.01.2016 / 19:43
1

Sua melhor aposta é encontrar um pacote que realmente suporte sua distribuição. Mas se isso não vai funcionar para você, então eu sei apenas um outro caminho.

Execute o ldd como você possui e, em seguida, 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:i386 e rezar para que a versão no Debian instável fosse boa o suficiente.

Você precisaria passar por cada linha do ldd, Google, procurar em seus repositórios disponíveis e, basicamente, ter sorte. Em seguida, instale-os um por um. Até que o programa seja executado. O ldd só funcionará para programas "simples". Programas que chamam plugins ou que executam código arbitrário são um assunto diferente, todos juntos. Para aqueles que você precisará executar a partir do console, e corrija as falhas / erros conforme eles acontecem.

Dito isto, um executável apenas binário é horrivelmente difícil de manter. Você pode querer considerar o uso de outra coisa. Se sua distro estiver um pouco à frente ou um pouco atrás do sistema que criou esse executável, talvez você nunca consiga fazê-lo funcionar.

    
por 19.11.2013 / 23:17