Aprenda Linux, 101: Gerenciar bibliotecas compartilhadas

Localize e carregue as bibliotecas necessárias a um programa

Aprenda a determinar quais são as bibliotecas compartilhadas necessárias aos seus programas executáveis do Linux® e como carregá-las. Use o material deste artigo para se preparar para o exame LPI 101 de certificação de administrador de sistema Linux ou simplesmente por diversão.

Ian Shields, Senior Programmer, IBM

Ian ShieldsIan Shields trabaja en múltiples proyectos Linux para la zona Linux dev developerWorks. Es Senior Programmer de IBM en el Research Triangle Park (RTP), Carolina del Norte. Ingresó a IBM en Canberra, Australia, como Systems Engineer en 1973, y desde entonces se dedica a sistemas de comunicaciones y computación ubicua en Montreal, Canadá, y en el RTP de Carolina del Norte. Es propietario de numerosas patentes y publicó diversos trabajos. Tiene una diplomatura en Matemática Pura y Filosofía de la Universidad Nacional de Australia. Es Máster y Doctor en Ciencias de la Computación de la Universidad Estatal de Carolina del Norte.


nível de autor Contribuidor do
        developerWorks

06/Abr/2010

Sobre esta série

Esta série de artigos destina-se a elucidar as tarefas de administração de sistema Linux. Também é possível usar os materiais nestes artigos como preparação para os exames Linux Professional Institute Certification nível 1 (LPIC-1).

Consulte o nosso roteiro do developerWorks para o LPIC-1 para obter a descrição e o link para cada um dos artigos nesta série. O roteiro está em andamento e reflete os últimos objetivos (abril de 2009) dos exames LPIC-1: à medida que formos concluindo estes artigos, eles serão adicionados ao roteiro. Enquanto isso, é possível achar versões anteriores do mesmo material, que dão suporte aos objetivos do LPIC-1 anteriores a abril de 2009, em nossos tutoriais de preparação para o exame de certificação LPI.

Visão geral

Neste artigo, você aprenderá a localizar e carregar as bibliotecas compartilhadas necessárias aos seus programas do Linux. Aprenda a:

  • Determinar quais bibliotecas um programa necessita
  • Saber como o sistema localiza bibliotecas compartilhadas
  • Carregar bibliotecas compartilhadas

Este artigo lhe ajuda na preparação para o objetivo 102.3 do tópico 102 do exame Junior Level Administration (LPIC-1) 101 do Linux Professional Institute. O objetivo tem peso 1.

Pré-requisitos

Para tirar o máximo dos artigos desta série, é necessário ter conhecimento básico de Linux e possuir um sistema Linux funcional em que seja possível praticar os comandos aqui abordados. Algumas vezes, é possível que versões diferentes de determinado programa formatem a saída de modo diferente, assim, pode ser que seus resultados não sejam exatamente iguais às listas e figuras exibidas neste documento. Particularmente, muitos dos exemplos deste artigo vêm de sistemas de 64 bits. Nós incluímos alguns exemplos de sistemas de 32 bits para ilustrar diferenças importantes.


Vínculos estáticos e dinâmicos

Entre em contato com Ian

Ian é um dos nossos autores mais populares e produtivos. Pesquise todos os artigos do Ian no developerWorks. Confira o perfil de Ian e entre em contato com ele, com outros autores e leitores no My developerWorks.

Os sistemas Linux têm dois tipos de programas executáveis:

  • Executáveis vinculados estaticamente contêm todas as funções da biblioteca que eles têm de executar; todas as funções da biblioteca estão vinculadas no executável. Eles são programas completos que não dependem de bibliotecas externas para execução. Uma vantagem de programas vinculados estaticamente é que eles funcionam sem pré-requisitos de instalação.
  • Os executáveis vinculados dinamicamente são programas muito menores e incompletos, ou seja, eles precisam de funções de bibliotecas compartilhadas externas para serem executados. Além de ser menor, o link dinâmico permite que um pacote especifique bibliotecas de pré-requisito sem a necessidade de incluí-las no pacote. O uso de link dinâmico também permite que muitos programas em execução compartilhem uma cópia de uma biblioteca em vez de ocupar a memória com muitas cópias do mesmo código. Por esses motivos, a maioria dos programas atualmente usa link dinâmico.

Um exemplo interessante em muitos sistemas Linux é o comando ln (/bin/ln), que cria links entre arquivos, sejam eles links físicos ou não-físicos (ou simbólicos). Este comando usa bibliotecas compartilhadas. Bibliotecas compartilhadas frequentemente envolvem links simbólicos entre um nome genérico para a biblioteca e um nível específico da biblioteca, assim, se os links não estão presentes ou estão quebrados por algum motivo, o próprio comando In pode estar inoperante, criando um problema circular. Para proteger-se contra essa possibilidade, alguns sistemas Linux incluem uma versão vinculada estaticamente do programa In como o programa sln (/sbin/sln). A Listagem 1 ilustra as grandes diferenças de tamanho entre o In dinamicamente vinculado e o sln estaticamente vinculado. O exemplo é do sistema Fedora 12 de 64 bits.

Listagem 1. Tamanhos de sln e In
[ian@echidna ~]$ ls -l /sbin/sln /bin/ln
-rwxr-xr-x. 1 root root  47384 2010-01-12 09:35 /bin/ln
-rwxr-xr-x. 1 root root 603680 2010-01-04 09:07 /sbin/sln

Quais bibliotecas são necessárias?

Embora não seja parte dos requerimentos atuais do exame LPI para este tópico, você deve saber que, hoje em dia, muitos sistemas Linux são executados em hardware que suporta executáveis tanto 32, quanto de 64 bits. Assim, muitas bibliotecas são compiladas em versões 32 e de 64 bits. As versões de 64 bits são normalmente guardadas sob a árvore /lib64 no sistema de arquivos, enquanto as versões de 32 bits ficam normalmente na árvore tradicional /lib. Você provavelmente irá achar tanto /lib/libc-2.11.1.so quanto /lib64/libc-2.11.1.so em um típico sistema Linux de 64 bits. Estas duas bibliotecas permitem que programas C 32 e de 64 bits sejam executados em um sistema Linux de 64 bits.

O comando ldd

Apesar de sabermos que um programa vinculado estaticamente provavelmente é grande, como dizemos se um programa é vinculado estaticamente? E se for vinculado dinamicamente, como sabemos de quais bibliotecas ele precisa? O comando Idd pode responder ambas as questões. Se você está executando um sistema como Debian ou Ubuntu, provavelmente não tem o executável sln, assim, recomenda-se verificar também o executável /sbin/ldconfig. A Listagem 2 mostra a saída do comando ldd para os executáveis ln e sln, assim como para o executável ldconfig. O exemplo é do sistema Fedora 12 de 64 bits (echidna). Para comparação, a saída de um antigo sistema Fedora 8 de 32 bits (pinguino) é exibida para /bin/ln.

Listagem 2. Saída de ldd para sln e ln.
[ian@echidna ~]$ #Fedora 12 64-bit
[ian@echidna ~]$ ldd /sbin/sln /sbin/ldconfig /bin/ln
/sbin/sln:
        not a dynamic executable
/sbin/ldconfig:
        not a dynamic executable
/bin/ln:
        linux-vdso.so.1 =>  (0x00007fff644af000)
        libc.so.6 => /lib64/libc.so.6 (0x00000037eb800000)
        /lib64/ld-linux-x86-64.so.2 (0x00000037eb400000)

[ian@pinguino ~]$ # Fedora 8 32-bit
[ian@pinguino ~]$ ldd /bin/ln
        linux-gate.so.1 =>  (0x00110000)
        libc.so.6 => /lib/libc.so.6 (0x00a57000)
        /lib/ld-linux.so.2 (0x00a38000)

Devido ao fato de Idd dizer respeito a vínculos dinâmicos, ele nos informa que sln e ldconfig estão estaticamente vinculados dizendo que eles "não são executáveis dinâmicos", ao mesmo tempo em que nos informa o nome de três bibliotecas compartilhadas (linux-vdso.so.1, libc.so.6 e /lib64/ld-linux-x86-64.so.2) que o comando ln necessita. Observe que .so indica que eles são objetos compartilhados ou bibliotecas dinâmicas. Esta saída também ilustra três tipos diferentes de informações que você provavelmente verá.

linux-vdso.so.1
é o Objeto Compartilhado Dinâmico Virtual do Linux, que vamos discutir em breve. Você também poderá ver linux-gate.so.1, como no exemplo do Fedora 8.
libc.so.6
contém um ponteiro para /lib64/libc.so.6.
/lib64/ld-linux-x86-64.so.2
é o caminho absoluto para outra biblioteca.

Na Listagem 3, usamos o comando ls -l para mostrar que as últimas duas bibliotecas são, uma após a outra, links simbólicos para versões específicas das bibliotecas. O exemplo é do sistema Fedora 12 de 64 bits.

Listagem 3. Links simbólicos da biblioteca
[ian@echidna ~]$ ls -l /lib64/libc.so.6 /lib64/ld-linux-x86-64.so.2
lrwxrwxrwx. 1 root root 12 2010-01-14 14:24 /lib64/ld-linux-x86-64.so.2 -> ld-2.11.1.so
lrwxrwxrwx. 1 root root 14 2010-01-14 14:24 /lib64/libc.so.6 -> libc-2.11.1.so

Objetos Compartilhados Dinâmicos Virtuais

Antigamente, no começo dos processadores x86, as comunicações dos programas do usuário para os serviços do supervisor eram realizadas através da interrupção de um software. Conforme a velocidade dos processadores foi aumentando, isso resultou em um gargalo muito sério. Começando com os processadores Pentium® II, a Intel® introduziu uma instalação Fast System Call para aumentar a velocidade das chamadas do sistema usando instruções SYSENTER e SYSEXIT em vez de interrupções.

A biblioteca que você vê como linux-vdso.so.1 é uma biblioteca virtual ou um Objeto Compartilhado Dinâmico Virtual, que reside somente no espaço de endereço de cada programa. Sistemas antigos chamavam isto de linux-gate.so.1. Esta biblioteca virtual fornece a lógica necessária para permitir que os programas do usuário acessem funções do sistema através dos meios mais rápidos disponíveis no processador em particular, interrompendo ou, nos processadores mais modernos, com o Fast System Call.


Carregamento dinâmico

A partir do precedente, você pode se surpreender ao aprender que /lib/ld-linux.so.2 e seu primo de 64 bits, /lib64/ld-linux-x86-64.so.2, se parecem com bibliotecas compartilhadas, mas que são, de fato, executáveis por si mesmo. Eles são o código responsável pelo carregamento dinâmico. Eles leem as informações do cabeçalho do executável, que está no formato Executable and Linking Format (ELF). Com base nessas informações, eles determinam quais bibliotecas são necessárias e quais precisam ser carregadas. Em seguida, eles executam vínculos dinâmicos para corrigir todos os ponteiros de endereço do executável e das bibliotecas carregadas, para que o programa seja executado.

A man page para o ld-linux.so também descreve o ld.so, que executa funções similares para o formato binário anterior a.out. A Listagem 4 mostra o uso da opção --list dos primos do ld-linux.so para exibir as mesmas informações do comando ln que mostramos com o comando ldd na Listagem 2.

Listagem 4. Usando ld-linux.so para exibir os requerimentos da biblioteca
[ian@echidna ~]$ /lib64/ld-linux-x86-64.so.2 --list /bin/ln
        linux-vdso.so.1 =>  (0x00007fffc9fff000)
        libc.so.6 => /lib64/libc.so.6 (0x00000037eb800000)
        /lib64/ld-linux-x86-64.so.2 (0x00000037eb400000)

[ian@pinguino ~]$ /lib/ld-linux.so.2 --list /bin/ln
        linux-gate.so.1 =>  (0x00110000)
        libc.so.6 => /lib/libc.so.6 (0x00a57000)
        /lib/ld-linux.so.2 (0x00a38000)

Observe que os endereços hexa podem ser diferentes entre as duas listagens. Eles também serão provavelmente diferentes se ldd for executado duas vezes.


Configuração de biblioteca dinâmica

Então, como o loader dinâmico sabe onde procurar os executáveis? Assim como muitas coisas no Linux, há um arquivo de configuração em /etc. De fato, há dois arquivos de configuração, /etc/ld/so/conf e /etc/ld.so.cache. A Listagem 5 mostra o conteúdo de /etc/ld.so.conf em um sistema Fedora 12 de 64 bits. Observe que /etc/ld.so.conf especifica que todos os arquivos .conf do subdiretório ld.so.conf.d devem ser incluídos. Sistemas mais antigos podem conter todas as entradas em /etc/ld/so/conf e não incluir entradas do diretório /etc/ld.so.conf.d. O conteúdo real de /etc/ld.so.conf ou do diretório /etc/ld.so.conf.d pode ser diferente no seu sistema.

Listagem 5. Conteúdo de /etc/ld.so.conf.
[ian@echidna ~]$ cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
[ian@echidna ~]$ ls /etc/ld.so.conf.d/*.conf
/etc/ld.so.conf.d/kernel-2.6.31.12-174.2.19.fc12.x86_64.conf
/etc/ld.so.conf.d/kernel-2.6.31.12-174.2.22.fc12.x86_64.conf
/etc/ld.so.conf.d/kernel-2.6.31.12-174.2.3.fc12.x86_64.conf
/etc/ld.so.conf.d/mysql-x86_64.conf
/etc/ld.so.conf.d/qt-x86_64.conf
/etc/ld.so.conf.d/tix-x86_64.conf
/etc/ld.so.conf.d/xulrunner-64.conf

O carregamento dos programas deve ser rápido, assim, use o comando ldconfig para processar o arquivo ld.so.conf e todos os arquivos incluídos do ld.so.conf, assim como bibliotecas dos diretórios confiáveis, /lib e /usr/lib, e quaisquer outras na linha de comando. O comando ldconfig cria os links e o cache necessários para bibliotecas compartilhadas recentemente usadas em /etc/ld.so.cache. O loader dinâmico usa a informação em cache para localizar arquivos que devem ser carregados e vinculados dinamicamente. Se você alterar ld.so.conf (ou adicionar novos arquivos incluídos a ld.so.conf.d), será preciso executar o comando ldconfig (como root) para criar novamente o arquivo ld.so.cache.

Normalmente, você usa o comando ldconfig sem parâmetros para criar novamente ld.so.cache. Há vários outros parâmetros que podem ser especificados para substituir esse comportamento padrão. Como de costume, tente man ldconfig para mais informações. A Listagem 6 mostra o uso do parâmetro -p para exibir os conteúdos de ld.so.cache.

Listagem 6. Usando ldconfig para exibir ld.so.cache
[ian@lyrebird ian]$ /sbin/ldconfig -p | less
1602 libs found in cache `/etc/ld.so.cache'
        libzip.so.1 (libc6,x86-64) => /usr/lib64/libzip.so.1
        libz.so.1 (libc6,x86-64) => /lib64/libz.so.1
        libz.so (libc6,x86-64) => /usr/lib64/libz.so
        libx86.so.1 (libc6,x86-64) => /usr/lib64/libx86.so.1
        libx11globalcomm.so.1 (libc6,x86-64) => /usr/lib64/libx11globalcomm.so.1
        libxul.so (libc6,x86-64) => /usr/lib64/xulrunner-1.9.1/libxul.so
        libxtables.so.2 (libc6,x86-64) => /usr/lib64/libxtables.so.2
        libxslt.so.1 (libc6,x86-64) => /usr/lib64/libxslt.so.1
        libxslt.so (libc6,x86-64) => /usr/lib64/libxslt.so
        libxpcom.so (libc6,x86-64) => /usr/lib64/xulrunner-1.9.1/libxpcom.so
        libxml2.so.2 (libc6,x86-64) => /usr/lib64/libxml2.so.2
        libxml2.so (libc6,x86-64) => /usr/lib64/libxml2.so
       ...
        libABRTdUtils.so.0 (libc6,x86-64) => /usr/lib64/libABRTdUtils.so.0
        libABRTUtils.so.0 (libc6,x86-64) => /usr/lib64/libABRTUtils.so.0
        ld-linux.so.2 (ELF) => /lib/ld-linux.so.2
        ld-linux-x86-64.so.2 (libc6,x86-64) => /lib64/ld-linux-x86-64.so.2

Carregando bibliotecas específicas

Caso você esteja executando um aplicativo mais antigo, que necessite de uma versão específica mais antiga de uma biblioteca compartilhada, ou se você está desenvolvendo uma nova biblioteca compartilhada ou versão de uma biblioteca compartilhada, é recomendado substituir os caminhos padrões de procura usados pelo loader. Isso pode também ser solicitado pelos scripts que usam bibliotecas compartilhadas específicas de produto, que podem estar instaladas na árvore /opt.

Do mesmo modo que é possível definir a variável PATH para especificar um caminho de procura para executáveis, é possível definir a variável LD_LIBRARY_PATH para uma lista de diretórios separados por sinais de dois pontos, onde se deve procurar por bibliotecas compartilhadas antes das bibliotecas do sistema especificadas em ld.so.cache. Por exemplo, você pode usar um comando como:

export LD_LIBRARY_PATH=/usr/lib/oldstuff:/opt/IBM/AgentController/lib

Consulte os Recursos abaixo para mais detalhes e links para outros artigos desta série.

Recursos

Aprender

  • Use o Roteiro do developerWorks para LPIC-1 e localize os artigos do developerWorks que se destinam à preparação para a certificação LPIC-1, conforme os objetivos de abril de 2009.
  • No site Programa LPIC, localize os objetivos detalhados, as listas de tarefas e as questões de amostra para os três níveis de certificação de administração de sistema Linux do Linux Professional Institute. Em particular, consulte os objetivos de abril de 2009 para o exame LPI 101 e o exame LPI 102. Sempre visite o site do Programa LPIC para obter os últimos objetivos.
  • Estude toda a série de preparação para o exame LPI no developerWorks a fim de conhecer os fundamentos do Linux e se preparar para a certificação de administrador do sistema com base nos objetivos para o exame LPI traçados antes de abril de 2009.
  • O Linux Documentation Project apresenta uma variedade de documentos úteis, especialmente suas questões práticas.
  • Na zona Linux do developerWorks, encontre centenas de artigos, tutoriais, fóruns de discussão e muitos outros recursos para desenvolvedores e administradores Linux.
  • Mantenha-se atualizado com os eventos técnicos e webcasts do developerWorks focados em uma variedade de produtos IBM e tópicos da indústria de TI.
  • Participe de uma orientação gratuita do developerWorks Live! para atualizar-se rapidamente sobre produtos e ferramentas da IBM, assim como tendências da indústria de TI.
  • Assista às demos on-demand do developerWorks que abrangem da instalação do produto e demos de configuração para iniciantes à funcionalidade avançada para desenvolvedores experientes.
  • Siga o developerWorks no Twitter.

Obter produtos e tecnologias

  • Avalie os produtos da IBM da forma que melhor lhe convém: Faça o download de uma versão de teste de produto, experimente um produto on-line, use um produto em um ambiente de nuvem ou passe algumas horas no SOA Sandbox aprendendo como implementar Arquitetura Orientada a Serviço de forma eficiente.

Discutir

Comentários

developerWorks: Conecte-se

Los campos obligatorios están marcados con un asterisco (*).


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


A primeira vez que você entrar no developerWorks, um perfil é criado para você. Informações no seu perfil (seu nome, país / região, e nome da empresa) é apresentado ao público e vai acompanhar qualquer conteúdo que você postar, a menos que você opte por esconder o nome da empresa. Você pode atualizar sua conta IBM a qualquer momento.

Todas as informações enviadas são seguras.

Elija su nombre para mostrar



Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Los campos obligatorios están marcados con un asterisco (*).

(Escolha um nome de exibição de 3 - 31 caracteres.)

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


Todas as informações enviadas são seguras.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Linux
ArticleID=480768
ArticleTitle=Aprenda Linux, 101: Gerenciar bibliotecas compartilhadas
publish-date=04062010