Bibliotecas Compartilhadas no Linux [Guia Básico]
Como funcionam as Bibliotecas Compartilhadas no Linux (shared libraries) no Linux, e como isso pode interferir no funcionamento dos programas.
Determinar quais as bibliotecas compartilhadas de que um programa executável depende para executar e instalá-las quando necessário faz parte dos objetivos do exame.
Para entendermos a gerência das bibliotecas compartilhadas, precisamos primeiro entender o que são bibliotecas e para que elas servem.
Durante a escrita do código fonte de um programa, o desenvolvedor faz uso de diversas funções e procedimentos já definidos pelo sistema operacional em arquivos chamados de bibliotecas.
Estas funções permitem que o programador possa usar recursos como escrita em disco, escrita na tela, receber dados do teclado, do mouse, enviar dados pela rede e muito mais, sem a necessidade de reescrever a roda.
Quando o programa é compilado, o último estágio de sua construção é fazer as ligações.
Alguns compiladores já fazem este processo de reunir todos os objetos necessários e compor um objeto final automaticamente.
Outros necessitam que o programador execute um outro programa chamado de linker. As bibliotecas podem ser entendidas de modo grosseiro como as “DLLs” do Windows.
Diretório /lib64
Nas distribuições modernas de 64 bits as bibliotecas ficam no diretório /lib64. Dependendo da arquitetura do processador, o nome do diretório pode variar (ex. /lib para 32 bits).
Tipos de Biblioteca
Existem dois tipos de bibliotecas no Linux. As estáticas e as dinâmicas. A decisão de qual biblioteca utilizar compete ao programador.
Ao usar uma biblioteca estática, o linker encontra as funções e procedimentos que o programa precisa, e as copia fisicamente no arquivo de saída executável gerado.
Isso faz com que o executável final possa rodar de forma independente sem utilizar nenhuma biblioteca. Mas perde-se no desempenho, no gasto desnecessário de memória e no tamanho do programa final.
É comum o programador fazer uso das bibliotecas compartilhadas ao invés de estáticas. Ao fazer as ligações de um programa que as utiliza, o linker faz uma referência às bibliotecas compartilhadas.
Desta forma, quando este programa for executado, o sistema terá de carregar primeiro as bibliotecas necessárias, se estas já não estiverem na memória.
Desta maneira, os executáveis gerados são mais eficientes, pois tendem a ser menores, usar menos memória e ocupar menos espaço em disco.
O ponto fraco desta metodologia é que os programas necessitam das bibliotecas compartilhadas e uma mudança nas versões destes arquivos também pode afetar o seu funcionamento.
O que são “soname” ?
Toda biblioteca compartilhada tem um nome especial chamado de “soname”. O soname é composto pelo prefixo “lib”, seguido do nome da biblioteca, o sufixo “.so.” e o número da versão da biblioteca que é incrementado quando esta sofre alterações na sua interface.
Por exemplo:
libjack-0.80.0.so.0
libvorbis.so.0
libWand.so.6
libjpeg.so.62
libwv2.so.1
Os arquivos executáveis são examinados no tempo de execução pelo linker de tempo de execução chamado ld.so.
Este interpretador especial completa as ligações entre o executável e as bibliotecas compartilhadas. Se o ld.so não conseguir encontrar e ler as dependências, ele irá falhar e o executável não irá ser carregado.
O Linker liga as bibliotecas ao software
O linker ld.so mantém índice de todas as bibliotecas e a sua localização num arquivo especial chamado /etc/ld.so.cache. Ele é binário e, portanto, pode ser lido rapidamente pelo ld.so.
É por isso que um administrador Linux tem de estar preparado para gerir as bibliotecas compartilhadas e as suas versões para um correto funcionamento do sistema e os seus aplicativos.
Neste artigo você pode aprender mais sobre o processo de compilação e “linkagem” dos programas nas bibliotecas.
Vejamos os utilitários que irão ajudar nesta tarefa:
Programa ldd no Linux
O comando ldd – List Dynamic Dependencies – fornece uma lista das dependências dinâmicas que um determinado programa precisa. Ele irá retornar o nome da biblioteca compartilhada e sua localização esperada.
Exemplo:
# ldd /bin/bash
libreadline.so.4 => /lib/libreadline.so.4 (0x4001c000)
libhistory.so.4 => /lib/libhistory.so.4 (0x40049000)
libncurses.so.5 => /lib/libncurses.so.5 (0x40050000)
libdl.so.2 => /lib/libdl.so.2 (0x40096000)
libc.so.6 => /lib/libc.so.6 (0x40099000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
# ldd ldd teste_dijkstra
libc.so.6 => /lib/libc.so.6 (0x4001c000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
Este comando é importante para determinarmos qual são as bibliotecas necessárias de um executável.
Programa ldconfig no Linux
O utilitário ldconfig cria os links e refaz o índice das bibliotecas dinâmicas do arquivo /etc/ld.so.cache.
Ele procura por bibliotecas nos diretórios /usr/lib e /lib, assim como nos diretórios listados em /etc/ld.so.conf, bem como o diretório informado na linha de comando.
As opções mais comuns são:
- -p: Lista o conteúdo do cache /etc/ld.so.cache.
- -v: Mostra o progresso da atualização do cache.
- -f: arquivo informa um outro arquivo de configuração diferente do padrão /etc/ld.so.conf.
Exemplos:
# ldconfig –p
229 libs found in cache ‘/etc/ld.so.cache’
src_vipa.so (ELF) => /usr/lib/src_vipa.so
libz.so.1 (libc6) => /lib/libz.so.1
libz.so.1 (libc6) => /usr/lib/libz.so.1
# ldconfig –v
/usr/X11R6/lib:
libSM.so.6 -> libSM.so.6.0
libdps.so.1 -> libdps.so.1.0
libXrender.so.1 -> libXrender.so.1.2
(…)
Variável ambiental LD_LIBRARY_PATH
Ainda é possível fornecer ao linker em tempo de execução ld.so uma lista de diretórios extras que podem conter bibliotecas compartilhadas através da variável ambiental LD_LIBRARY_PATH.
Uma lista de diretórios poderá ser configurada, separando-os por dois pontos “:”. Esta lista antecede a lista do arquivo ls.so.conf.
# set | grep LD_LIBRARY_PATH
LD_LIBRARY_PATH=/usr/lib
Por razões de segurança, a variável LD_LIBRARY_PATH é ignorada pelo ld.so quando este faz ligações de programas que possuem o bit SUID ou SGID habilitados.
Seu uso é comum para testar novas rotinas em bibliotecas em desenvolvimento ao invés de executar as rotinas já instaladas.
Toda vez que uma nova biblioteca for instalada, ou uma nova versão de biblioteca, é necessário atualizar o cache do linker ld.so com o comando ldconfig.
Aprenda muito mais sobre Linux em nosso curso online. Você pode efetuar a matrícula aqui. Se você já tem uma conta, ou quer criar uma, basta entrar ou criar seu usuário aqui.
Gostou? Compartilhe
Tag:/lib, bibliotecas, LD_LIBRARY_PATH, ld.so, ld.so.conf, ldcondif, ldd, libraries, Linux, shared