2011-12-03 3 views
8

Ho bisogno di collegare dinamicamente una libreria che ho creato. Non sono esattamente sicuro di quale sia il problema. Il tutto viene compilato correttamente, ma ho sempre prendere handle come il puntatore NULL:Uso corretto librerie libdl e collegate dinamicamente

void *handle; 
char *error; 
handle = dlopen ("./hw11-lib-michaelSchilling.so", RTLD_LAZY); 
//same error comes up with full path as well as './hw11...' 
if(!handle){ 
    error = dlerror(); 
    printf("%s\n", error); 
    printf("Error loading library.\n"); 
    exit(1); 
} 

Non posso avere superato questo errore e non sono sicuro di quello che potrebbe essere sbagliato. Sono abbastanza sicuro di aver compilato tutto correttamente. Ecco i passaggi di compilazione che ho usato:

gcc -rdynamic -c hw11-lib-michaelSchilling.c -o hw11-lib-michaelSchilling.so 
gcc hw11-michaelSchilling-4.c -ldl -o hw11-michaelSchilling-4 

Ricevo un errore che recita

solo ET_DYN e ET_EXEC possono essere caricati.

risposta

14

Quando si crea hw11-lib-michaelSchilling.so, non sembra dire a gcc che si desidera un oggetto condiviso (lo .so nel nome non è sufficiente).

Con la -c è la produzione di un file oggetto (non un condiviso oggetto) e chiamandolo michaelSchilling.so. Il linker non viene nemmeno richiamato.

Rimuovere il -c dalla riga di comando gcc e aggiungere -shared:

gcc -shared -rdynamic hw11-lib-michaelSchilling.c -o hw11-lib-michaelSchilling.so 
+0

Insieme a '-rdynamic'? Ho appena provato con entrambi e con solo '-shared', ma ho avuto lo stesso errore. –

+0

@MichaelSchilling: Non penso che '-rdynamic' abbia a che fare con il problema, quindi potresti anche tenerlo nel caso in cui sia necessario dal tuo codice. – NPE

+0

@MichaelSchilling: hai rimosso il '-c'? – NPE

0

È hw11-lib-michaelSchilling.so nella radice assoluta del tuo file system? Stai sostenendo che lo sta conducendo un taglio su di esso ... ma sospetto che non lo sia.

Nella gestione degli errori, includere l'output di dlerror() in ciò che si stampa, per individuare la causa dell'errore.

+0

hw11 -lib-michaelSchilling.so: impossibile aprire il file oggetto condiviso: Nessun file o directory di questo tipo Questo è l'errore che ottengo, ma è la stessa directory del programma che sto tentando di eseguire. Ho anche rimosso la barra. –

+0

Provare a fornire il percorso assoluto completo all'oggetto condiviso per vedere se questo aiuta. – mah

+0

L'ho fatto e ho ottenuto che solo ET_DYN e ET_EXEC possano essere caricati. –

1

Una barra (/) come primo carattere di un percorso indica che il percorso è assoluto (relativo alla directory principale), non relativo alla directory di lavoro corrente e certamente non relativo alla posizione del file binario. Dovrai specificare il percorso completo individuando la posizione del file binario (che non è un problema facile in sé) o potresti utilizzare $ORIGIN con dlopen (funziona con rpath ma non sono sicuro che funzioni con dlopen).

+0

Che dire di un periodo prima del percorso? ('. /') –

+0

Ciò lo rende relativo alla directory di lavoro corrente, non alla posizione del programma binario. –

0
gcc -fPIC -shared -rdynamic library.c -o library.o 

lavori per me su Linux quando si compila la libreria per il codice che si apre, è necessario -ldl