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