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.
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 DSO“dynamic 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
Caso queira estudar autotools(estou lendo este livro 😉 )
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