2010-09-02 17 views
8

Kann eine statische Bibliothek *.a in Linux zur Laufzeit dynamisch geladen werden?
Ich habe gelesen, dass herestatische Bibliothek dynamisch laden?

... sowohl statische als auch gemeinsam genutzte Bibliotheken als dynamisch geladene Bibliotheken verwendet werden können.

Wie statische Bibliothek dynamisch laden?

Antwort

8

Eine statische Bibliothek ist mehr oder weniger nur eine Sammlung von Objektdateien. Wenn Sie eine statische Bibliothek in einem Programm verwenden möchten, müssen Sie die ausführbare Datei damit verknüpfen. Die ausführbare Datei enthält dann die statische Bibliothek (oder die Teile, die Sie verwendet haben).

Wenn Sie eine statische Bibliothek zur Laufzeit mit dlopen laden möchten, müssen Sie zunächst eine dynamische Bibliothek libfoo.so erstellen, die sie enthält.

+0

Diese Problemumgehung bedeutet, dass ich eine gemeinsam genutzte Bibliothek aus einer statischen Bibliothek erstellen müsste, wenn ich sie dynamisch laden möchte. Dies bedeutet, dass das dynamische Laden einer statischen Bibliothek nicht möglich ist und dass nur dynamische Bibliotheken zum dynamischen Laden verwendet werden können? Wenn ja, dann ist das Zitat, das ich aus der Quelle angegeben habe, nicht korrekt. –

+0

Der zitierte Text ist falsch, oder ich interpretiere falsch, was sie bedeuten. – JesperE

4

Öffnen einer .a Datei mit dlopen funktioniert nicht funktionieren (getestet auf Ubuntu 10.04). Mit dem folgenden Beispielprogramm:

#include <dlfcn.h> 
#include <stdio.h> 

int main() 
{ 
    void *lib_handle = dlopen("/usr/lib/libz.a",RTLD_LAZY); 
    printf("dlopen error=%s\n",dlerror()); 

    printf("lib_handle=%p\n",lib_handle); 
} 

ich:

dlopen error=/usr/lib/libz.a: invalid ELF header 
lib_handle=(nil) 

während bei der Verwendung von /usr/lib/libz.so stattdessen erhalte ich:

dlopen error=(null) 
lib_handle=0x19d6030 

so der gleiche Code funktioniert für ein gemeinsames Objekt.