quinta-feira, 16 de dezembro de 2010

Verificando as Dependências (Bibliotecas) de um Programa

Quando instalamos um programa no Linux através de repositórios (usando o apt-get, yum, ou outro gerenciador qualquer), não nos damos conta da gama de operações que estes gerenciadores fazem para garantir a integridade do programa, ou seja, garantir que seja instalado o programa correto, com a compilação para a sua arquitetura, que seja a versão mais nova apontada e que faça instalar, concomitantemente, todas as dependências deste programa. É simplesmente uma maravilha não nos preocuparmos com isto!
Contudo, algumas vezes somos forçados a baixar aplicativos que não estão no repositório... daí toda esta magestosa praticidade cai por terra... como verificar se o programa que você acabou de baixar vai rodar?? Como saber se você realmente tem instaladas, em sua máquina, todas as bibliotecas, nas versões corretas, de que ele precisa?? Como achar e instalar as bibliotecas que estão faltando?? Se você se encontra perdido entre estas cruéis indagações, então neste artigo lhe apresentaremos duas soluções interessantes que vão dar uma luz a sua vida!!


  • Usando o comando ldd

É possível que em sua máquina já exista instalado este comando. Ele é muito simples: basta que se digite "ldd [arquivo]", e você terá a lista de todas as dependências do arquivo informado. Lembre-se de que o arquivo deve ser um binário executável, e não um script de texto, como muitos programas em Shell Script ou Python (caso seu programa seja em Python, a própria máquina virtual vai informar o trace do programa, mostrando as bibliotecas de import que não foram encontradas). Exemplo do ldd:

ldd /opt/eclipse/eclipse
linux-gate.so.1 => (0x00310000)
libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0x0061e000)
libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0x0020c000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00311000)
/lib/ld-linux.so.2 (0x00a99000)

Veja que são informadas as bibliotecas e o caminho onde elas devem estar!! Se você quiser obter ainda mais detalhes, utilize o parâmetro "-v". Desta forma, você poderá descobrir não só as dependências do arquivo, como também as dependências das dependências, tornando bem fácil a instalação e resolução de grande parte dos problemas. Exemplo:

ldd -v /opt/eclipse/eclipse
linux-gate.so.1 => (0x0069d000)
libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0x009e7000)
libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0x00f0c000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00a50000)
/lib/ld-linux.so.2 (0x00f31000)

Version information:
/opt/eclipse/eclipse:
libpthread.so.0 (GLIBC_2.0) => /lib/tls/i686/cmov/libpthread.so.0
libdl.so.2 (GLIBC_2.1) => /lib/tls/i686/cmov/libdl.so.2
libdl.so.2 (GLIBC_2.0) => /lib/tls/i686/cmov/libdl.so.2
libc.so.6 (GLIBC_2.3) => /lib/tls/i686/cmov/libc.so.6
libc.so.6 (GLIBC_2.1) => /lib/tls/i686/cmov/libc.so.6
libc.so.6 (GLIBC_2.0) => /lib/tls/i686/cmov/libc.so.6
/lib/tls/i686/cmov/libpthread.so.0:
ld-linux.so.2 (GLIBC_2.3) => /lib/ld-linux.so.2
ld-linux.so.2 (GLIBC_2.1) => /lib/ld-linux.so.2
ld-linux.so.2 (GLIBC_PRIVATE) => /lib/ld-linux.so.2
libc.so.6 (GLIBC_2.1.3) => /lib/tls/i686/cmov/libc.so.6
libc.so.6 (GLIBC_2.1) => /lib/tls/i686/cmov/libc.so.6
libc.so.6 (GLIBC_2.3.2) => /lib/tls/i686/cmov/libc.so.6
libc.so.6 (GLIBC_2.2) => /lib/tls/i686/cmov/libc.so.6
libc.so.6 (GLIBC_PRIVATE) => /lib/tls/i686/cmov/libc.so.6
libc.so.6 (GLIBC_2.0) => /lib/tls/i686/cmov/libc.so.6
/lib/tls/i686/cmov/libdl.so.2:
ld-linux.so.2 (GLIBC_PRIVATE) => /lib/ld-linux.so.2
libc.so.6 (GLIBC_2.1.3) => /lib/tls/i686/cmov/libc.so.6
libc.so.6 (GLIBC_2.1) => /lib/tls/i686/cmov/libc.so.6
libc.so.6 (GLIBC_2.0) => /lib/tls/i686/cmov/libc.so.6
libc.so.6 (GLIBC_PRIVATE) => /lib/tls/i686/cmov/libc.so.6
/lib/tls/i686/cmov/libc.so.6:
ld-linux.so.2 (GLIBC_PRIVATE) => /lib/ld-linux.so.2
ld-linux.so.2 (GLIBC_2.3) => /lib/ld-linux.so.2
ld-linux.so.2 (GLIBC_2.1) => /lib/ld-linux.so.2

Mais opções e alguma ajuda podem ser obtidas com o help:

man ldd
ou: ldd --help


  • Usando o comando getlibs

O comando getlibs dá um passo a frente do ldd! Com ele, não só você conseguirá verificar se existem bibliotecas faltando para seu programa rodar, como também poderá baixar e instalar automaticamente as bibliotecas omissas. De fato, um programinha de ouro para qualquer usuário, desde um administrador de sistemas até o usuário doméstico!!
Provavelmente o getlibs não estará instalado em seu sistema, e talvez não exista no repositório. No entanto, ele poderá ser baixado gratuitamente do site:

http://frozenfox.freehostia.com/cappy/

Se seu sistema é baseado em Debian, baixe o arquivo .deb e instale com o seguinte comando (como superusuário!!):

dpkg -i getlibs-all.deb

Agora é só verificar as dependências:

getlibs /opt/eclipse/eclipse
This application isn't missing any dependencies

A mensagem acima indica que não há dependências faltando. Caso haja, o getlibs vai indicar quais sejam elas e tentar baixá-las e instalá-las para você.
Mais detalhes sobre as opções e parâmetros do getlibs podem ser encontradas neste link.
Aí está: outro programa extremamente útil, que pode lhe salvar dos últimos desesperos da alta madrugada, quando nada mais parecer ter vida...

Bom, claro, muito mais importante do que tudo isso: COMENTEM!!!!

Um comentário:

edinan einstein Diniz disse...

Cara!! Excelente os artigos do pajé!! Muito bons mesmo! Parabens