2010-12-10 22 views
6

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

Respuesta

4

Estos dos modos de uso se suele llamar implícita y explícita. Como indicó correctamente, la diferencia en la carga es que la biblioteca dinámica explícitamente vinculada se carga cuando se ejecuta dlopen y la biblioteca vinculada implícitamente se carga en el momento en que la aplicación se carga en la memoria. Cada dlopen puede tardar milisegundos en finalizar, a menos que la biblioteca ya esté cargada, en cuyo caso es muy rápido, por lo que si tiene requisitos de latencia muy estrictos o necesita cargar/descargar frecuentemente, puede optar por vincular implícitamente o cargar explícitamente la biblioteca al inicio del programa y no lo descargue hasta que ya no se use.

+0

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? –

5

La principal diferencia está en el manejo de errores. Implícito es más fácil, pero si hay un problema (falta la biblioteca o la función no está en la biblioteca) el programa no podrá ejecutarse en absoluto. Con la carga explícita, puede verificar las llamadas dlopen/dlsym para ver si hay errores y si hay algún problema, recurra a alguna alternativa.

Para responder a su tercera pregunta, realmente depende de la arquitectura, pero en la mayoría de los ABI todavía puede cargar un objeto compartido compilado sin -PIC, pero puede ser más lento de cargar y requerir más memoria.

+0

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 utilizo enlaces implícitos o se realiza automáticamente cuando esas aplicaciones se cargan? –

+0

@kobac: no: las bibliotecas compartidas siempre se vinculan cuando se cargan, ya sea cuando se inicia la aplicación o cuando se llama a dlopen –

Cuestiones relacionadas