Pesquisa de site

Compreendendo bibliotecas compartilhadas no Linux


Na programação, uma biblioteca é uma variedade de trechos de código pré-compilados que podem ser reutilizados em um programa. As bibliotecas simplificam a vida dos programadores, pois fornecem funções, rotinas, classes, estruturas de dados e assim por diante reutilizáveis (escritas por outro programador), que eles podem usar em seus programas.

Por exemplo, se você está construindo um aplicativo que precisa realizar operações matemáticas, você não precisa criar uma nova função matemática para isso, você pode simplesmente usar funções existentes em bibliotecas para aquela linguagem de programação.

Exemplos de bibliotecas no Linux incluem libc (a biblioteca C padrão) ou Glibc (versão GNU da biblioteca C padrão), libcurl (arquivo multiprotocolo biblioteca de transferência), libcrypt (biblioteca usada para criptografia, hash e codificação em C) e muito mais.

O Linux suporta duas classes de bibliotecas, a saber:

  • Bibliotecas estáticas – são vinculadas estaticamente a um programa em tempo de compilação.
  • Bibliotecas dinâmicas ou compartilhadas – são carregadas quando um programa é iniciado e carregadas na memória e a ligação ocorre em tempo de execução.

Bibliotecas dinâmicas ou compartilhadas podem ainda ser categorizadas em:

  • Bibliotecas vinculadas dinamicamente – aqui um programa é vinculado à biblioteca compartilhada e o kernel carrega a biblioteca (caso não esteja na memória) na execução.
  • Bibliotecas carregadas dinamicamente – o programa assume o controle total chamando funções com a biblioteca.

Convenções de nomenclatura de biblioteca compartilhada

As bibliotecas compartilhadas são nomeadas de duas maneiras: o nome da biblioteca (também conhecido como soname) e um “nome do arquivo” (caminho absoluto para o arquivo que armazena o código da biblioteca).

Por exemplo, o soname para libc é libc.so.6: onde lib é o prefixo, c é um nome descritivo, portanto significa objeto compartilhado, e 6 é a versão. E o nome do arquivo é: /lib64/libc.so.6. Observe que o soname é na verdade um link simbólico para o nome do arquivo.

Localizando Bibliotecas Compartilhadas no Linux

Bibliotecas compartilhadas são carregadas por ld.so (ou ld.so.x) e ld-linux.so (ou ld- linux.so.x), onde x é a versão. No Linux, /lib/ld-linux.so.x pesquisa e carrega todas as bibliotecas compartilhadas usadas por um programa.

Um programa pode chamar uma biblioteca usando seu nome de biblioteca ou nome de arquivo, e um caminho de biblioteca armazena diretórios onde as bibliotecas podem ser encontradas no sistema de arquivos. Por padrão, as bibliotecas estão localizadas em /usr/local/lib, /usr/local/lib64, /usr/lib e /usr/lib64; as bibliotecas de inicialização do sistema estão em /lib e /lib64. Os programadores podem, entretanto, instalar bibliotecas em locais personalizados.

O caminho da biblioteca pode ser definido no arquivo /etc/ld.so.conf que você pode editar com um editor de linha de comando.

vi /etc/ld.so.conf 

As linhas neste arquivo instruem o kernel a carregar o arquivo em /etc/ld.so.conf.d. Dessa forma, os mantenedores de pacotes ou programadores podem adicionar seus diretórios de bibliotecas personalizados à lista de pesquisa.

Se você olhar no diretório /etc/ld.so.conf.d, verá arquivos .conf para alguns pacotes comuns (kernel, mysql e postgresql em este caso):

ls /etc/ld.so.conf.d

kernel-2.6.32-358.18.1.el6.x86_64.conf  kernel-2.6.32-696.1.1.el6.x86_64.conf  mariadb-x86_64.conf
kernel-2.6.32-642.6.2.el6.x86_64.conf   kernel-2.6.32-696.6.3.el6.x86_64.conf  postgresql-pgdg-libs.conf

Se você der uma olhada em mariadb-x86_64.conf, verá um caminho absoluto para empacotar bibliotecas.

cat mariadb-x86_64.conf

/usr/lib64/mysql

O método acima define o caminho da biblioteca permanentemente. Para defini-lo temporariamente, use a variável de ambiente LD_LIBRARY_PATH na linha de comando. Se você quiser manter as alterações permanentes, adicione esta linha no arquivo de inicialização do shell /etc/profile (global) ou ~/.profile (específico do usuário).

export LD_LIBRARY_PATH=/path/to/library/file

Gerenciando bibliotecas compartilhadas no Linux

Vejamos agora como lidar com bibliotecas compartilhadas. Para obter uma lista de todas as dependências da biblioteca compartilhada para um arquivo binário, você pode usar o utilitário ldd. A saída de ldd está no formato:

library name =>  filename (some hexadecimal value)
OR
filename (some hexadecimal value)  #this is shown when library name can’t be read

Este comando mostra todas as dependências da biblioteca compartilhada para o comando ls.

ldd /usr/bin/ls
OR
ldd /bin/ls
Saída de amostra
	linux-vdso.so.1 =>  (0x00007ffebf9c2000)
	libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003b71e00000)
	librt.so.1 => /lib64/librt.so.1 (0x0000003b71600000)
	libcap.so.2 => /lib64/libcap.so.2 (0x0000003b76a00000)
	libacl.so.1 => /lib64/libacl.so.1 (0x0000003b75e00000)
	libc.so.6 => /lib64/libc.so.6 (0x0000003b70600000)
	libdl.so.2 => /lib64/libdl.so.2 (0x0000003b70a00000)
	/lib64/ld-linux-x86-64.so.2 (0x0000561abfc09000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003b70e00000)
	libattr.so.1 => /lib64/libattr.so.1 (0x0000003b75600000)

Como as bibliotecas compartilhadas podem existir em muitos diretórios diferentes, pesquisar em todos esses diretórios quando um programa é iniciado seria muito ineficiente: o que é uma das prováveis desvantagens das bibliotecas dinâmicas. Portanto é empregado um mecanismo de cache, executado pelo programa ldconfig.

Por padrão, ldconfig lê o conteúdo de /etc/ld.so.conf, cria os links simbólicos apropriados nos diretórios de links dinâmicos e então grava um cache em /etc/ld.so.cache que é facilmente usado por outros programas.

Isto é muito importante, especialmente quando você acabou de instalar novas bibliotecas compartilhadas ou criou as suas próprias, ou criou novos diretórios de bibliotecas. Você precisa executar o comando ldconfig para efetuar as alterações.

ldconfig
OR
ldconfig -v 	#shows files and directories it works with

Depois de criar sua biblioteca compartilhada, você precisa instalá-la. Você pode movê-lo para qualquer um dos diretórios padrão mencionados acima e executar o comando ldconfig.

Alternativamente, execute o seguinte comando para criar links simbólicos do soname para o nome do arquivo:

ldconfig -n /path/to/your/shared/libraries

Para começar a criar suas próprias bibliotecas, confira este guia do The Linux Documentation Project (TLDP).

É tudo por agora! Neste artigo, apresentamos uma introdução às bibliotecas e explicamos as bibliotecas compartilhadas e como gerenciá-las no Linux. Se você tiver alguma dúvida ou ideias adicionais para compartilhar, use o formulário de comentários abaixo.