Como detectar dependências ausentes para um executável?

2

Analisando o link como o autor sabia qual dependência estava faltando? Existe uma maneira genérica de procurar a lista de dependências de um arquivo executável e quais estão faltando?

UPDATE : só notei que o link era usado

  

readelf -l [executável]

Esta é a melhor abordagem?

    
por Gili 28.07.2013 / 16:20

1 resposta

1

Na questão do AskUbuntu, o autor sabia qual dependência estava faltando porque ele estava tentando instalar um aplicativo de 32 bits em uma instalação do Ubuntu de 64 bits e, para citá-lo:

  

algumas bibliotecas de 32 bits estão ausentes no Ubuntu de 64 bits.

Então ele precisava instalá-los.

No entanto, para responder às suas perguntas:

  • Como detectar dependências ausentes para um executável?
  • Existe uma maneira genérica de procurar a lista de dependências de um arquivo executável e quais estão faltando?

Sim, existe uma maneira de detectar dependências ausentes ou obter uma lista delas.

Detectar dependências ausentes:

O sistema de gerenciamento de pacotes apt , usado nas distribuições Linux baseadas no Debian, é um sistema inteligente, onde detectará automaticamente se os pacotes atualmente instalados têm dependências ausentes (mesmo se você os instalou usando dpkg e não apt-get ). Digamos que você tenha instalado um pacote, sem suas dependências, da próxima vez que executar apt-get upgrade , você receberá um erro semelhante a este:

The following packages have unmet dependencies:
 package1 : Depends: package2 (>= 1.8) but 1.7.5-1ubuntu1 is to be installed

A indicação de que package1 depende de package2 e package2 (ou seja, a versão mais recente neste exemplo) não está instalada. Geralmente, para corrigir isso, você executa o comando sudo apt-get install -f , que instrui apt-get a tentar recuperar e instalar os pacotes ausentes.

Procure a lista de dependências de um executável:

O pacote apt , bem como dpkg , fornece uma maneira simples de listar as dependências de um pacote.

  • Para apt , o comando é:

    apt-cache depends <packagename>
    

    Isto irá verificar o pacote nos repositórios e listar as dependências, assim como os pacotes "sugeridos". Se você realmente quiser filtrar apenas as dependências, poderá filtrar a saída fazendo isso: apt-cache depends <packagename> | grep Depends . Aqui está um exemplo de saída:

    alaa@aa-lu:~$ apt-cache depends vlc
    vlc
      Depends: fonts-freefont-ttf
      Depends: vlc-nox
     |Depends: libavutil51
      Depends: libxpm4
      Depends: zlib1g
      PreDepends: dpkg
      Suggests: videolan-doc
      Recommends: vlc-plugin-notify
      Recommends: xdg-utils
      Breaks: vlc-data
      Breaks: vlc-nox
      Replaces: vlc-data
      Replaces: vlc-nox

    A saída é reduzida para brevidade.

  • Para dpkg , o comando para executá-lo em um arquivo local é:

    dpkg -I file.deb | grep Depends
    

    dpkg -I file.deb retorna muitas informações sobre esse arquivo .deb , então filtramos para ver apenas as dependências.

Como apt é na verdade apenas um front-end para o dpkg , ambos os comandos essencialmente fazem a mesma coisa , eles vão olhar o arquivo .deb do aplicativo para descobrir quais dependências ele precisa, exceto apt-cache irá procurar nos repositórios. Estas "dependências" são listadas dentro do arquivo .deb como metadados, é por isso que mesmo que você tenha baixado e instalado manualmente um aplicativo (que geralmente é um arquivo .deb , você será instalando-o usando dpkg e não apt ) de um site (por exemplo, o navegador Chrome do Google do site do Google), apt ainda vai descobrir que existem dependências ausentes, analisando os pacotes instalados.

Eu não sou bem versado com todo esse material de arquitetura de computadores, mas no caso de Java nessa questão, é realmente sobre a arquitetura de 32 e 64 bits. Para citar a resposta do stackoverflow:

Você está executando em um sistema de 64 bits sem um ambiente de tempo de execução de 32 bits.

Essa biblioteca específica, que precisava ser instalada, não foi incluída na parte "Dependências" do pacote de instalação, porque ele estava instalando um aplicativo de 32 bits em um sistema de 64 bits. Portanto, foi necessária uma solução de problemas extra para encontrar o culpado, daí o uso de readelf e ldd . No entanto, elas provavelmente são mais específicas para bibliotecas e lembre-se de que "dependências" nem sempre são "bibliotecas", mas podem ser outras aplicações. Então, " esta é a melhor abordagem? ", duvido; Acho que só é melhor quando é necessário solucionar problemas extra.

    
por Alaa Ali 28.07.2013 / 16:40