Essa biblioteca possui uma função main()
ou ponto de entrada equivalente e foi compilada de tal maneira que é útil tanto como um executável quanto como um objeto compartilhado.
Aqui está uma sugestão sobre como fazer isso, embora isso não aconteça trabalhe para mim.
Aqui está outra em uma resposta a uma pergunta semelhante sobre o SO , que vou plagiar, ajustar e adicionar descaradamente um pouco de explicação.
Primeiro, fonte de nossa biblioteca de exemplos, test.c
:
#include <stdio.h>
void sayHello (char *tag) {
printf("%s: Hello!\n", tag);
}
int main (int argc, char *argv[]) {
sayHello(argv[0]);
return 0;
}
Compile isso:
gcc -fPIC -pie -o libtest.so test.c -Wl,-E
Aqui, estamos compilando uma biblioteca compartilhada ( -fPIC
), mas dizendo ao vinculador que é um executável regular ( -pie
), e para tornar sua tabela de símbolos exportável ( -Wl,-E
), de modo que possa ser útilmente ligado.
E, embora file
diga que é um objeto compartilhado, ele funciona como um executável:
> ./libtest.so
./libtest.so: Hello!
Agora precisamos ver se realmente pode ser dinamicamente vinculado. Um programa de exemplo, program.c
:
#include <stdio.h>
extern void sayHello (char*);
int main (int argc, char *argv[]) {
puts("Test program.");
sayHello(argv[0]);
return 0;
}
Usar extern
nos poupa de criar um cabeçalho. Agora compile isso:
gcc program.c -L. -ltest
Antes de podermos executá-lo, precisamos adicionar o caminho de libtest.so
para o carregador dinâmico:
export LD_LIBRARY_PATH=./
Agora:
> ./a.out
Test program.
./a.out: Hello!
E ldd a.out
mostrará a vinculação a libtest.so
.
Note que duvido que a glibc seja realmente compilada, já que provavelmente não é tão portável quanto a própria glibc (veja man gcc
em relação às opções -fPIC
e -pie
), mas ela demonstra o mecanismo básico . Para os detalhes reais você teria que olhar para o makefile de origem.