Si construyo una biblioteca compartida (objeto compartido) puedo usarlo de dos maneras:
La primera forma es usar una biblioteca compartida como usaría una biblioteca estática.Dilema sobre las bibliotecas compartidas en Unix
#include "myLib.h"
//...
//afterwards I can use functions defined in mylib.h
myFunction();
La segunda manera de usar la biblioteca compartida es llamando a funciones API de carga dinámica: dlopen
, dlsym
y dlclose
de dlfcn.h
. Usaría la biblioteca compartida de esta manera cuando quiero implementar un patrón de complemento, por ejemplo. Lista se vería así:
#include <dlfcn.h>
void *myLib; /* Handle to shared lib file */
void (*myFunction)(); /* Pointer to loaded function */
//...
//load shared object
myLib = dlopen("/home/dlTest/myLib.so",RTLD_LAZY);
dlerror();
//get handle to function
myFunction = dlsym(myLib, "myFunction");
dlerror();
//execute function
(*myFunction)();
//close lib
dlclose(myLib);
dlerror();
Ahora mi primera pregunta es: ¿cuál es la diferencia entre estos dos usos del objeto compartido en términos de tiempo de carga? Al utilizar la biblioteca compartida de la primera manera, estamos vinculando/cargando la biblioteca compartida a la aplicación principal en tiempo de carga y de la segunda forma estamos haciendo lo mismo en tiempo de ejecución.
Segunda pregunta. ¿Cuál es el nombre de estos dos usos? La primera se llama biblioteca compartida estáticamente enlazada y la segunda es una biblioteca compartida enlazada/cargada dinámicamente?
Tercera pregunta Si he creado una biblioteca compartida sin el indicador -fPIC
(código independiente de osición), ¿podría utilizarlo de otra manera?
Saludos
Si cambio una biblioteca compartida y la vuelvo a compilar, ¿tengo que volver a vincular todas las aplicaciones principales que usan esa biblioteca compartida si estoy usando enlaces implícitos o se hace automáticamente cuando esas aplicaciones se cargan? –