GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Statische Bibliothek dynamisch laden?

Ein .a ist ein Archiv, das ein oder mehrere .o-Elfen-Objekte enthält. Readelf und objdump analysieren sie nicht. Sie müssen ar verwenden, um die .o-Dateien aus dem Archiv zu extrahieren. Es ist wichtig zu wissen, dass Sie, wenn Sie bereit sind, Zeit für das Schreiben und Debuggen einer Variante von load_elf() aufzuwenden, die eine oder mehrere statische Bibliotheken in eine HAL packen kann, diese dynamisch laden und Clients eine Möglichkeit bieten können, ihren Aufrufeintrag zu überprüfen Punkte. Das ist nicht Standard, und ich kann schon fühlen, wie die Literaten wie The Walking Jed zucken. Die ELF enthält jedoch genügend Informationen, um eine Bibliothek in einer Laufzeitumgebung abzulegen und ordnungsgemäß codierten Clientfunktionen eine Möglichkeit zu geben, die Schnittstelle zu den bereitgestellten Funktionen zu erkennen und sie aufzurufen. Das ist keine Raketenwissenschaft. Es ist einfach langweilig. Ein wichtiges Konzept hier ist, dass ein Entwickler, der das .a-Archiv und eine Include-Suite mit der Idee bereitstellt, dass sie Ihre Verwendung der Bibliotheken einschränken, nur lästig ist. Es stellt kein ernsthaftes Hindernis dar, die Bibliothek zu verwenden oder herauszufinden, wie sie ihre Aufgabe erfüllt.


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 zuerst eine dynamische Bibliothek erstellen libfoo.so enthält.


Öffnen eines .a Datei mit dlopen tut nicht funktionieren (getestet auf Ubuntu 10.04). Mit folgendem 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 bekomme:

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

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

dlopen error=(null)
lib_handle=0x19d6030

derselbe Code funktioniert also für ein gemeinsames Objekt.


Linux
  1. ld kann keine vorhandene Bibliothek finden

  2. Konvertieren Sie eine statische Bibliothek in eine gemeinsam genutzte Bibliothek?

  3. Bibliothekspfad beim dynamischen Laden?

  4. Das statische Linken von Linux ist tot?

  5. Was bedeutet Warnung:Das Verknüpfen der gemeinsam genutzten Bibliothek mit der statischen Bibliothek ist nicht portierbar?

Richten Sie unter Linux eine statische Netzwerkverbindung ein

So fügen Sie eine statische Bibliothek in ein Makefile ein

Fehler beim Laden der gemeinsam genutzten Bibliothek (glew)

Verwenden Sie eine C-Bibliothek in Swift unter Linux

Wie listet man Abhängigkeiten der statischen c/c++-Bibliothek auf?

Was ist eine .so-Datei?