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.