Entendendo bibliotecas compartilhadas no Linux

Entendendo bibliotecas compartilhadas no Linux

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

Por exemplo, se você estiver criando um aplicativo que precisa executar operações de matemática, não precisa criar uma nova função de matemática para isso, pode simplesmente usar as funções existentes nas bibliotecas para essa 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 (Biblioteca de transferência de arquivos multiprotocolo), 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 - estão vinculados a um programa estaticamente em tempo de compilação.
  • Bibliotecas dinâmicas ou compartilhadas - são carregados quando um programa é lançado e carregado na memória e a ligação ocorre no tempo de execução.

Bibliotecas dinâmicas ou compartilhadas podem ser categorizadas em:

  • Bibliotecas dinamicamente vinculadas - Aqui, um programa está vinculado à biblioteca compartilhada e o kernel carrega a biblioteca (caso não esteja na memória) após a execução.
  • Bibliotecas carregadas dinamicamente - O programa assume o controle total chamando funções com a biblioteca.

Convenções de nomeação de bibliotecas compartilhadas

Bibliotecas compartilhadas são nomeadas de duas maneiras: o nome da biblioteca (a.k.a soname) e um "nome do arquivo" (caminho absoluto para arquivar que armazena o código da biblioteca).

Por exemplo, o soname para libc é libc.então.6: onde lib é o prefixo, c é um nome descritivo, então significa objeto compartilhado e 6 é a versão. E seu nome de arquivo é: /lib64/libc.então.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.então (ou LD.então.x) e LD-Linux.então (ou LD-Linux.então.x) programas, onde x é a versão. Em Linux, /lib/ld-linux.então.x Pesquisas e cargas todas as bibliotecas compartilhadas usadas por um programa.

Um programa pode ligar para uma biblioteca usando seu nome ou nome de arquivo da biblioteca, e um caminho da 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; Bibliotecas de inicialização do sistema estão em /lib e /lib64. Os programadores podem, no entanto, instalar bibliotecas em locais personalizados.

O caminho da biblioteca pode ser definido em /etc/ld.então.conf Arquivo que você pode editar com um editor de linha de comando.

# vi /etc /ld.então.conf 

As linhas neste arquivo instruem o kernel a carregar o arquivo /etc/ld.então.conf.d. Dessa forma, mantenedores de pacotes ou programadores podem adicionar seus diretórios de biblioteca personalizados à lista de pesquisas.

Se você olhar para o /etc/ld.então.conf.d diretório, você verá .conf arquivos para alguns pacotes comuns (kernel, mysql e postgresql neste caso):

# ls /etc /ld.então.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 no mariadb-x86_64.Conf, você verá um caminho absoluto para embalar as bibliotecas.

# CAT MARIADB-X86_64.conf /usr/lib64/mysql 

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

# Export ld_library_path =/path/to/biblioteca/arquivo 

Gerenciando bibliotecas compartilhadas no Linux

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

Nome da biblioteca => nome do arquivo (algum valor hexadecimal) ou nome do arquivo (algum valor hexadecimal) #Isso é mostrado quando o nome da biblioteca não pode ser lido 

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

# ldd/usr/bin/ls ou # ldd/bin/ls 
Saída de amostra
 Linux-vdso.então.1 => (0x00007ffebf9c2000) libelinux.então.1 => /lib64 /libselinux.então.1 (0x0000003B71E00000) Librt.então.1 => /lib64 /librt.então.1 (0x0000003B71600000) libcap.então.2 => /lib64 /libcap.então.2 (0x0000003b76a00000) libacl.então.1 => /lib64 /libacl.então.1 (0x0000003B75E00000) LIBC.então.6 => /lib64 /libc.então.6 (0x0000003B70600000) libdl.então.2 => /lib64 /libdl.então.2 (0x0000003b70a00000) /lib64 /ld-linux-x86-64.então.2 (0x0000561ABFC09000) LIBPTHREAD.então.0 => /lib64 /libpthread.então.0 (0x0000003b70e00000) libattr.então.1 => /lib64 /libattr.então.1 (0x0000003B75600000) 

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

Por padrão, LDCONFIG lê o conteúdo de /etc/ld.então.conf, cria os links simbólicos apropriados nos diretórios de link dinâmico e depois escreve um cache para /etc/ld.então.cache que é facilmente usado por outros programas.

Isso é muito importante, especialmente quando você acabou de instalar novas bibliotecas compartilhadas ou criar seu próprio, ou criou novos diretórios de biblioteca. Você precisa executar o LDCONFIG comando para efetuar as mudanças.

# ldconfig ou # ldconfig -v #shows e diretórios com os quais funciona 

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 LDCONFIG comando.

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

# ldconfig -n/path/to/your shared/bibliotecas 

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

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