RSS

Introdução a bibliotecas em C

17 dez

Lendo post do meu amigo sigsegv sobre “ld preload”
fiquei motivado escrever algo sobre bibliotecas em C ,
algo bem informal bem como ajudar iniciantes.assim como fiz
no post de pkg-config.

master librarian

master librarian do game castlevania

Criando uma biblioteca estática (Static library)
———————————————————————
Quando a ligação é feita durante a criação de um executável ou
outro arquivo objeto, ele é conhecido como vinculação estática
ou early binding. Neste caso, a ligação é feita geralmente por
um linker, mas também pode ser feito pelo compilador. A biblioteca
estática, também conhecida como um archive, é que se destina a ser
ligada estaticamente.

vamos la

$ vim test.c

int sum(int a,int b)
{
 return a+b;
}

:wq!
para criar o arquivo com extensão “.o”
$ gcc -Wall -c test.c

passamos para “.a”
$ ar -cvq test.a test.o

pronto agora você pode usar sua bibliotéca estática
$ gcc -o a a.c test.a

também pode-se fazer
$ gcc -o a a.c -ltest

$ vim a.c

 #include <stdio.h>

 int main()
 {
  printf("%d \n",sum(2,2));
 }

:wq!

ao executar “a” devera resultar em “4” no stdout


Criando uma biblioteca dinâmica (Dynamic Library)

———————————————————-

Carregamento dinâmico é um mecanismo pelo qual um programa de computador pode, em
tempo de execução, carregar uma biblioteca (ou binário outros) para a memória,
recuperar os endereços de funções e variáveis contidas na biblioteca, executar
essas funções ou acessar essas variáveis, e descarregar o biblioteca da memória.

Ao contrário de vinculação estática e tempo de carregamento ligando, este mecanismo
permite que um programa de computador para a inicialização, na ausência destas
bibliotecas, para descobrir as bibliotecas disponíveis e potencialmente ganhar
funcionalidades adicionais.

No windows este tipo de biblioteca se chama DLL (dynamic-link library) em Unix Like
e afins chama-se DSOdynamic shared object

man ld.so” para mais informações

vamos la

$ gcc -Wall -fPIC -c test.c
$ gcc -shared -Wl,-soname,test.so.1 -o test.so.1.0 test.o
$ mv test.so.1.0 /lib
$ ln -sf /lib/test.so.1.0 /lib/test.so
$ ln -sf /lib/test.so.1.0 /lib/test.so.1

Entendendo os argv(argumentos)

-fPIC” seria uma diretiva para compilar de forma independente
Ideia é adicionar um nível adicional de indireção a todos os
dados globais e referências de função no código. utilizando algumas
partes da ligação e carregamento de processos, é possível fazer a
seção de texto da biblioteca compartilhada e independente
de posição, no sentido de que ele possa ser facilmente mapeado em diferentes
endereços da memória sem a necessidade de mudar um pouco.
-shared” Produzir um objeto compartilhado que pode ser relacionado com
outros objetos para formar um executável.
aqui explica melhor

um “man gcc” não faz mal para saúde 😉

na hora de compilar

$ gcc -Wall -I/path/to/include-files -L/path/to/libraries a.c -ltest -o a

ou também
$ gcc -Wall -L/lib a.c -ltest -o a

Por fim
————
bom aqui foi uma introdução bem superficial, sugiro estudar
autotools e cmake,bem como automatizar suas tarefas , não
conheço ninguém que goste deles, são muitas paradigmas a
seguir, muitos fins de semana a perder fazendo testes com
autoconf automake… Entretanto é um estudo que me parece
indispensável para quem quer ser um programador em C completo.

Para estudo do cmake(é bem mais fácil de usar) esse link
cmake

Caso queira estudar autotools(estou lendo este livro 😉 )
autotools

bom se este post não fui o suficiente para você sugiro que leia
o paper do meu amigo sigsegv sobre ELF para entender linkagem
das bibliotecas e algo mais… AQUI

 
Deixe um comentário

Publicado por em dezembro 17, 2011 em Linguagem C

 

Deixe um comentário