Bibliotecas compartilhadas

Propaganda
Coluna do Alexandre
COLUNA
Bibliotecas
compartilhadas
Aprenda a trabalhar com bibliotecas compartilhadas em C,
visando o reaproveitamento de código.
C
omo prometi na última coluna, vamos continuar relembrando as bibliotecas em C, e nesta
edição, vamos utilizar as bibliotecas compartilhadas. Qual a diferença entre as bibliotecas estáticas
e compartilhadas? No primeiro caso, todas as funções
referenciadas pelo programa são incluídas dentro do
executável final ao término da compilação, ou seja, o
tamanho do arquivo final é maior, sem qualquer referência externa às funções especializadas do programa.
No caso das bibliotecas compartilhadas, as funções
disponíveis na biblioteca permanecem, mesmo após a
compilação do programa, em um arquivo à parte (em
geral com extensão .so), para assim, serem utilizadas por
qualquer outro executável que necessite destas mesmas
funções, tornando a reutilização do código algo viável.
Então as bibliotecas compartilhadas (shared libraries) são a melhor solução para qualquer caso? Infelizmente não, pois todas elas devem ser carregadas no
momento da inicialização do programa, o que pode
implicar em impacto de performance. Para solucionar esta dificuldade, vamos utilizar bibliotecas carregadas dinamicamente (e é o que veremos na coluna
da próxima edição).
A proposta é a mesma e os arquivos dos programas
são os mesmos da coluna passada (que estão disponíveis
pra download neste link [1] ). Lembrando: é um programa que calcula a área de um quadrado e a área de
um triângulo dados os valores fornecidos pelo usuário.
O arquivo area.h fornece as declarações das funções, o
arquivo func1.c fornece o cálculo do quadrado, o arquivo
func2.c fornece o cálculo do triângulo e, por fim, o arquivo principal.c representa o nosso programa de teste.
Seguem os passos para a construção da nossa biblioteca compartilhada:
22
# gcc -fPIC -c func1.c
# gcc -fPIC -c func2.c
Feito isso, executamos:
# gcc -shared func1.o func2.o -o libsharedarea.so
Note que o nome da biblioteca é sharedarea, todavia
o prefixo lib vai no início de sua designação, ficando
como libsharedarea.so.
Se tudo caminhou bem, agora basta construir a aplicação final usando a biblioteca compartilhada sharedarea:
# gcc principal.c -L. -lsharedarea -o linuxmagazine
Ainda não será possível executar o programa, pois ao
tentar executá-lo, vamos nos deparar com a seguinte
mensagem de erro:
# ./linuxmagazine
/linuxmagazine: error while loading shared
libraries: libsharedarea.so: cannot open shared
object file: No such file or directory
Por que não funcionou?
Ainda precisamos informar à aplicação onde encontrar a nova biblioteca e, como argumentado antes, a
mesma será carregada pela aplicação no início de sua
execução. Confirme esse problema com o uso do ldd:
# ldd linuxmagazine
linux-vdso.so.1 => (0x00007fffffffe000)
libsharedarea.so => not found
libc.so.6 => /lib/libc.so.6 (0x00007f9ddc5e1000)
http://www.linuxmagazine.com.br
Matéria | SEÇÃO
SEÇÃO
/lib64/ld-linux-x86-64.so.2
(0x00007f9ddc934000)
A maneira mais simples de resolver este problema é:
# export LD_LIBRARY_PATH=$ LD_
LIBRARY_PATH:.
Finalmente, temos:
# ldd linuxmagazine
linux-vdso.so.1 =>
(0x00007fa81abfb000)
libsharedarea.so
(0x00007fa81a7e0000)
libc.so.6 => /lib/libc.so.6
(0x00007fa81a48d000)
/lib64/ld-linux-x86-64.so.2
(0x00007fa81a9e1000)
Pronto. Agora é só executar nosso programa e tudo funciona como
deveria:
# ./linuxmagazine
Na próxima coluna, vamos relembrar as bibliotecas carregadas
dinamicamente. Até lá. n
Mais informações
[1] Fontes do programa:
http://www.linuxmagazine.
com.br/issues/70/
bibliotecas_c.rar
Alexandre Borges ([email protected],
twitter: @ale_sp_brazil) é Especialista Sênior
em Solaris, OpenSolaris e Linux. Trabalha com
desenvolvimento, segurança, administração
e performance desses sistemas operacionais,
atuando como instrutor e consultor. É pesquisador de novas tecnologias e assuntos relacionados ao kernel.
Linux Magazine #70 | Setembro de 2010
23
Download