Saltar para o conteúdo
101 · LPIC-1 (parte 1)

Gerenciar bibliotecas compartilhadas

TópicoT06ObjetivoGerenciar bibliotecas compartilhadasPeso1PáginasLPIC-1 (101) - Version 5.0

Resumo Conciso

Bibliotecas Estáticas vs Compartilhadas

CaracterísticaBiblioteca EstáticaBiblioteca Compartilhada (Dinâmica)
VínculoMesclada no momento da compilaçãoReferenciada em tempo de execução
Cópia no programaSim (incorporada)Não (apenas referência)
Dependência em runtimeNãoSim (deve estar disponível)
Tamanho do executávelMaiorMenor
AtualizaçãoRecompilar programaAtualizar biblioteca (afeta todos os programas)
Extensão do arquivo.a (ex: libpthread.a).so (ex: libpthread.so.0)

Convenção de Nomenclatura (Soname)

bash
lib<nome>.so.<versão>

Exemplo: libpthread.so.0 → nome=libpthread, sufixo=so, versão=0

Links simbólicos apontam para arquivos com versão completa:

bash
$ ls -l /lib/x86_64-linux-gnu/libc.so.6lrwxrwxrwx 1 root root 12 ... libc.so.6 -> libc-2.24.so

Locais Comuns para Bibliotecas Compartilhadas

  • /lib
  • /lib32
  • /lib64
  • /usr/lib
  • /usr/local/lib

Configuração dos Caminhos

Arquivo principal: /etc/ld.so.conf

bash
include /etc/ld.so.conf.d/*.conf

Diretório de configuração: /etc/ld.so.conf.d/

  • Contém arquivos *.conf com caminhos absolutos para diretórios de bibliotecas

Exemplo: /etc/ld.so.conf.d/x86_64-linux-gnu.conf

bash
/lib/x86_64-linux-gnu/usr/lib/x86_64-linux-gnu

Variável de Ambiente LD_LIBRARY_PATH

AçãoComando
DefinirLD_LIBRARY_PATH=/usr/local/mylib
Exportarexport LD_LIBRARY_PATH=/usr/local/mylib
Verificarecho $LD_LIBRARY_PATH
Removerunset LD_LIBRARY_PATH
PermanentizarAdicionar export LD_LIBRARY_PATH=... em /etc/bash.bashrc ou ~/.bashrc

Comandos Essenciais

ComandoFunçãoExemplo
ldconfigConfigura vínculos de tempo de execução e atualiza /etc/ld.so.cachesudo ldconfig
ldconfig -vExibe versões, diretórios e vínculos criadossudo ldconfig -v
ldconfig -pExibe cache atual de bibliotecassudo ldconfig -p
lddLista dependências de bibliotecas de um programaldd /usr/bin/git
ldd -uLista dependências diretas não utilizadasldd -u /usr/bin/git

Exemplo de Saída do ldd

bash
$ ldd /usr/bin/git    linux-vdso.so.1 =>  (0x00007ffcbb310000)    libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f18241eb000)    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f1823fd1000)    libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f1823db6000)    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f1823b99000)    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f1823991000)    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f18235c7000)    /lib64/ld-linux-x86-64.so.2 (0x00007f182445b000)

Comandos Adicionais

ComandoFunção
readelfExibe informações sobre arquivos ELF
objdumpExibe informações de arquivos-objeto
linux-vdso.so.1linux-vdsoso1
libprocps.so.6libprocpsso6
libdl.so.2libdlso2
libc.so.6libcso6
libsystemd.so.0libsystemdso0
ld-linux-x86-64.so.2ld-linux-x86-64so2

Exercício Guiado 2 — Adicionar diretório de biblioteca

Enunciado: Você desenvolveu um programa e deseja adicionar um novo diretório de biblioteca compartilhada em seu sistema (/opt/lib/mylib). Você escreve o caminho absoluto em um arquivo chamado mylib.conf.

  • Em que diretório deve ser armazenado esse arquivo?
  • Qual comando deve ser executado para que as alterações sejam totalmente efetivas?

Solução:

  • /etc/ld.so.conf.d
  • ldconfig

Exercício Guiado 3 — Dependências do kill

Enunciado: Qual comando você usaria para listar as bibliotecas compartilhadas exigidas por kill? Solução: ldd /bin/kill

Exercícios Exploratórios

Exercício Exploratório 1 — Usando objdump

Enunciado: objdump é um utilitário de linha de comando que exibe informações sobre arquivos objeto.

  1. Use objdump com -p e grep para exibir as dependências de glibc:
  2. Use objdump com -p e grep para exibir o soname de glibc:
  3. Use objdump com -p e grep para exibir as dependências do Bash:
bash
# Dependências de glibcobjdump -p /lib/x86_64-linux-gnu/libc.so.6 | grep NEEDED# Soname de glibcobjdump -p /lib/x86_64-linux-gnu/libc.so.6 | grep SONAME# Dependências do Bashobjdump -p /bin/bash | grep NEEDED

Exercício Exploratório 2 — Usando ldd para analisar dependências

Enunciado: Use ldd para descobrir quais bibliotecas compartilhadas o comando ls depende. Identifique qual biblioteca fornece a função de compressão (zlib) e qual fornece suporte a localization (locale).

bash
# Listar todas as dependências do lsldd /bin/ls# Identificar a biblioteca zlib (compressão)ldd /bin/ls | grep libz# Identificar a biblioteca de locale (suporte a internacionalização)ldd /bin/ls | grep libc.so.6

A saída mostrará libz.so.1 para compressão (zlib) e libc.so.6 (glibc) para suporte a locale. É o glibc que fornece as rotinas de internacionalização (setlocale, nl_langinfo, etc.); não existe uma liblocale separada. (Nota: libpthread.so.0, quando presente, refere-se a POSIX threads, e não a locale.)

Exercício Exploratório 3 — Testando LD_LIBRARY_PATH

Enunciado: Crie um diretório temporário, copie uma biblioteca para ele e teste se o LD_LIBRARY_PATH permite ao sistema encontrá-la.

bash
# Criar diretório temporáriomkdir -p /tmp/mylib# Copiar uma biblioteca para o diretóriocp /lib/x86_64-linux-gnu/libz.so.1 /tmp/mylib/# Verificar que ldd não encontra no novo caminholdd /bin/ls | grep libz# Adicionar o diretório ao LD_LIBRARY_PATHexport LD_LIBRARY_PATH=/tmp/mylib:$LD_LIBRARY_PATH# Verificar que agora encontra a biblioteca no novo caminholdd /bin/ls | grep libz# Limpar a variávelunset LD_LIBRARY_PATH

Exercício Exploratório 4 — Usando ldconfig para gerenciar cache

Enunciado: Use ldconfig para verificar o estado atual do cache de bibliotecas do sistema e identificar quantas bibliotecas estão cacheadas.

bash
# Exibir o cache atual de bibliotecas (contagem)ldconfig -p | wc -l# Exibir apenas as bibliotecas que começam com "lib"ldconfig -p | head -20# Verificar o soname de uma biblioteca específicaldconfig -p | grep libc.so# Verificar diretórios que o ldconfig utilizaldconfig -v 2>/dev/null | grep -E "^/lib|^/usr/lib"

O comando ldconfig -p mostra o cache /etc/ld.so.cache que o dynamic linker usa para localizar bibliotecas rapidamente.