Hands On: Shared Libraries no Linux

01/10/2014 Marcos Paulo de Souza 3 min de leitura

Bibliotecas compartilhadas são usadas em qualquer sistema operacional, seja Windows, Linux, Mac OSX ou qualquer *BSD ou *NIX. No Windows este recurso tem o nome de DLL (Dynamic-link Library) com sua extensão .dll, no Mac OSX tem a extensão .dylib  e nos outros sistemas UNIX-like(Linux, *BSD) este se chama Shared Object e tem extensão .so. Um entendimento básico sobre o funcionamento deste recurso ajuda muito usuários destes sistemas a resolverem possíveis problemas de falta de bibliotecas.

A nomenclatura de bibliotecas compartilhadas segue um padrão em cada sistema. Nos sistemas Linux o padrão é lib<nome_da_lib><.versão>.so. Podemos exemplificar esta convenção com a biblioteca pthreads no Linux. No Fedora, esta biblioteca está definida como libpthread-2.18.so, e um link libpthread.so para esta biblioteca.

Sobre a localização de bibliotecas compartilhadas, no Fedora as libs estão dentro de /usr/lib64. Em sistemas 32 bits, fica dentro de /usr/lib.

Para poder fazer uso de uma shared library utilizando o GCC no Linux basta adicionar um parâmetro -l<nome_da_biblioteca>. O prefixo lib neste caso deve ser removido. Para exemplificar o uso de uma biblioteca na compilação de um programa C/C++ temos o seguinte comando abaixo:


gcc fonte.c -o bin -lpthread

No comando acima estamos compilando o programa fonte chamado fonte.c, gerando um binário com o nome bin e estamos linkando com a biblioteca pthreads do Linux.

Para criar um biblioteca compartilhada é uma tarefa simples. Para iniciar uma biblioteca precisamos criar uma função que será utilizada em outros programas. Como exemplo, irei criar o arquivo soma.c e soma.h para criar uma biblioteca chamada libmatematica.so.

Os arquivos soma.h e soma.c são listados abaixo:

soma.c



int soma(int a, int b)

{
    return a + b;
}

soma.h



int soma(int a, int b);

A linha de comando abaixo compila o código fonte soma.c e cria a biblioteca libmatematica.so:



gcc -shared -Wall soma.c -o libmatematica.so

A opção -shared diz ao GCC que o binário compilado será uma biblioteca compartilhada. O arquivo soma.h será utilizada pelos programas que vão usar esta biblioteca. O programa a seguir, chamado main.c, vai utilizar a função soma da biblioteca que criamos:


#include <soma.h>
#include <stdio.h>

int main()
{
    printf("%dn", soma(1, 5));
    return 0;
}

Para compilar este programa usamos o comando abaixo:



gcc main.c -o main -lmatematica

Ao executar o binário main, obtemos como saída o número 6, número este que é retornado pela função soma da biblioteca libmatematica.so.

Podemos ainda verificar quais bibliotecas um binário específico utiliza. O comando ldd é o responsável por dar tal informação . O comando abaixo mostra quais as bibliotecas utilizadas no binário main recém gerado utiliza.



ldd main

Como saída eu obtive:


[[email protected] teste]$ ldd main
linux-vdso.so.1 => (0x00007fff339fe000)
libmatematica.so => /home/marcos/teste/libmatematica.so (0x00007fb8129fb000)
libc.so.6 => /lib64/libc.so.6 (0x00007fb812612000)
/lib64/ld-linux-x86-64.so.2 (0x00007fb812bfe000)

Algumas observações sobre a biblioteca e o arquivo header. No include foi utilizado os símbolos “<” e “>” ao redor do nome do header. Quando usamos esta notação o compilador espera que o header este dentro da estrutura /usr/include. Para este teste eu movi o arquivo soma.h para lá. Sobre o parâmetro -l<nome_lib>, como já explicado antes, espera-se que a biblioteca esteja dentro de /usr/lib. Para este teste eu criei um link simbólico libmatematica.so dentro de /usr/lib e apontei para a pasta a pasta onde está a minha biblioteca.

Alguns link interessantes sobre o assunto:

http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html

http://linux.die.net/man/1/gcc

http://unixhelp.ed.ac.uk/CGI/man-cgi?ldd+1

Qualquer dúvida, crítica ou sugestão, basta colocar nos comentários! Não se esqueçam de se inscrever no nosso feed!  Até mais pessoal!