Un .a est une archive contenant un ou plusieurs objets .o elf. Readelf et objdump ne les analyseront pas. Vous devez utiliser ar pour extraire les fichiers .o de l'archive. Il est important de réaliser que si vous êtes prêt à passer du temps à écrire et à déboguer une variante de load_elf() qui peut envelopper une ou plusieurs bibliothèques statiques dans un HAL, vous pouvez les charger dynamiquement et fournir aux clients un moyen d'introspecter leur entrée d'appel points. Ce n'est pas standard, et je peux déjà sentir les secousses littéraires comme The Walking Jed. Cependant, l'ELF contient suffisamment d'informations pour déposer une bibliothèque dans un environnement d'exécution et donner aux fonctions client correctement codées un moyen de découvrir l'interface des fonctions fournies et de les appeler. Ce n'est pas sorcier. C'est tout simplement fastidieux. Un concept important ici est qu'un développeur qui fournit l'archive .a et une suite d'inclusion avec l'idée qu'ils restreignent votre utilisation des bibliothèques, est simplement ennuyeux. Ce n'est pas un obstacle sérieux à l'utilisation de la bibliothèque ou à la découverte de son travail.
Une bibliothèque statique est plus ou moins juste une collection de fichiers objets. Si vous souhaitez utiliser une bibliothèque statique dans un programme, vous devez lui lier l'exécutable. L'exécutable contiendra alors la bibliothèque statique (ou les parties que vous avez utilisées).
Si vous souhaitez charger une bibliothèque statique lors de l'exécution en utilisant dlopen
, vous devrez d'abord créer une bibliothèque dynamique libfoo.so
le contenant.
Ouvrir un .a
fichier utilisant dlopen
n'est pas travail (testé sur Ubuntu 10.04). Avec le programme exemple suivant :
#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);
}
J'obtiens :
dlopen error=/usr/lib/libz.a: invalid ELF header
lib_handle=(nil)
lors de l'utilisation de /usr/lib/libz.so
à la place, j'obtiens :
dlopen error=(null)
lib_handle=0x19d6030
donc le même code fonctionne pour un objet partagé.