2010-12-10 1 views
6

Se creo una libreria condivisa (oggetto condiviso), posso usarla in due modi:
Il primo modo è usare una libreria condivisa come farei con una libreria statica.Dilemma sulle librerie condivise su Unix

  #include "myLib.h" 
      //... 
      //afterwards I can use functions defined in mylib.h 
      myFunction(); 

Il secondo modo di usare libreria condivisa è chiamando funzioni API caricatore dinamico: dlopen, dlsym, e dlclose da dlfcn.h. Vorrei usare la libreria condivisa in questo modo quando voglio implementare un pattern di plugin, per esempio. Listing sarebbe simile a questa:

#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(); 

Ora la mia prima domanda è: qual è la differenza tra questi due usi di oggetto condiviso in termini di tempi di caricamento? Utilizzando la libreria condivisa nel primo modo, stiamo collegando/caricando la libreria condivisa all'app principale in tempo di caricamento e nel secondo modo stiamo facendo la stessa cosa in fase di esecuzione?

Seconda domanda. Qual è il nome di questi due usi? La prima è chiamata libreria condivisa collegata staticamente e la seconda è una libreria condivisa collegata/caricata dinamicamente?

Terza domanda Se ho costruito una libreria condivisa, senza -fPIC bandiera (codice indipendente osizione), dovrei essere in grado di usarlo in un secondo modo?

Acclamazioni

risposta

4

Queste due modalità di uso sono in genere chiamati implicita ed esplicita. Come hai affermato correttamente, la differenza nel caricamento è che la libreria dinamica collegata in modo esplicito viene caricata quando viene eseguito dlopen e la libreria collegata in modo implicito viene caricata nel momento in cui l'applicazione viene caricata in memoria. Ogni dlopen può richiedere millisecondi, a meno che la libreria non sia già stata caricata, nel qual caso è molto veloce, quindi se hai requisiti di latenza molto stringenti o hai bisogno di fare frequenti operazioni di caricamento/scaricamento, puoi decidere di fare il link implicito o caricare esplicitamente la libreria all'avvio del programma e non scaricarlo fino a quando non viene più utilizzato.

+0

Se cambio una libreria condivisa e la ricompilifico, devo ricollegare tutte le applicazioni principali che usano quella lib condivisa se sto usando il collegamento implicito o è fatto automaticamente quando quelle applicazioni caricano? –

5

La differenza principale è nella gestione degli errori. Implicito è più facile, ma se c'è un problema (la libreria è mancante o la funzione non è nella libreria) il programma non funzionerà affatto. Con il caricamento esplicito, è possibile controllare le chiamate dlopen/dlsym per errori e se c'è un problema, ricorrere a qualche alternativa.

Per rispondere alla terza domanda, in realtà dipende dall'architettura, ma sulla maggior parte delle ABI è ancora possibile caricare un oggetto condiviso compilato senza -PIC, ma potrebbe essere più lento da caricare e richiedere più memoria.

+0

Se cambio una libreria condivisa e la ricompilifico, devo ricollegare tutte le applicazioni principali che usano quella lib condivisa se sto usando il collegamento implicito o è fatto automaticamente quando caricano quelle applicazioni? –

+0

@kobac: no - le librerie condivise sono sempre collegate quando vengono caricate, sia all'avvio dell'applicazione, sia quando viene chiamato dlopen –