sábado, 7 de janeiro de 2012

Shared Libraries no Linux

Shared libraries são bibliotecas que são carregadas pelos programas quando eles iniciam.

Precisamos entender a diferença entre o nome da biblioteca, soname, e seu real name.
Toda shared library tem um nome especial chamado de "soname". O soname tem o prefixo "lib", o nome da biblioteca, o sufixo ".so" seguido de ponto e um número de versão que é incrementado sempre que a interface muda. Normalmenteo soname é um link simbólico para o real name da shared library.
Exemplo de soname: libctest.so.1

Toda a shareed libray possui um real name. Que é o nome do arquivo que contém o código da biblioteca. O real name adiciona ao soname um ponto, um número, que é o minor number, outro ponto e o número da versão.
Exemplo de real name: libctest.so.1.0

Além disso, há um nome usado pelo compilador para requisitar a library, que é simplesmente o soname sem nenhum número de versão.
Exemplo: libctest.so


Colocando em prática:

Primeiramente vamos ter dois arquivos que são:
operacoes.c – que vai conter nosso código fonte
operacoes.h – que vai conter apenas as definições

Código do arquivo operacoes.c

#include "operacoes.h"

int somaDeInterios (int n1, int n2)
{
return n1 + n2;
}

int multInteiros (int n1, int n2)
{
return n1 * n2;
}

Código do arquivo operacoes.h

#ifndef _OPERACOES
#define _OPERACOES

int somaDeInterios (int n1, int n2);
int multInteiros (int n1, int n2);

#endif


Agora vamos digitar o comandos:
gcc -fPIC -c operacoes.c
Veja que fio gerado o aquivo: operacoes.o

Agora, vamos gerar a nossa library propriamente dita:

gcc -shared -Wl,-soname,libcmatematica.so.1 -o libcmatematica.so.1.0 operacoes.o

Vamos copiar o arquivo gerado: libcmatematica.so.1.0 para dentro da pasta /usr/lib, talvez você deva estar logado como root para executar esse passo:

cp libcmatematica.so.1.0 /usr/lib

Agora vamos criar os links necessários, talvez tenha que estar logado com root:

ln -sf /usr/lib/libcmatematica.so.1.0 /usr/lib/libcmatematica.so
ln -sf /usr/lib/libcmatematica.so.1.0 /usr/lib/libcmatematica.so.1

Bom, agora, vamos criar um simples programa para verificar se a nossa biblioteca realmente funciona.

Vamos chamar nosso arquivo de main.c

Código do arquivo main.c

#include "operacoes.h"
#include <stdio.h>

int main()
{
printf("\n\tTeste da Shared library");
printf("\n\t5 + 2 = %d", somaDeInterios(5,2));
printf("\n\t5 * 2 = %d", multInteiros(5,2));
}

Para compilar:
gcc main.c -lcmatematica -o operacoesInteiras

Resultado:
Teste da Shared library
5 + 2 = 7
5 * 2 = 10

Nenhum comentário:

Postar um comentário