GNU/Linux >> Linux Esercitazione >  >> Linux

caricamento dinamico della libreria statica?

Un .a è un archivio contenente uno o più oggetti .o elf. Readelf e objdump non li analizzeranno. Devi usare ar per estrarre i file .o dall'archivio. È importante rendersi conto che se sei disposto a dedicare del tempo alla scrittura e al debug di una variante di load_elf() che può racchiudere una o più librerie statiche in un HAL, puoi caricarle dinamicamente e fornire ai client un modo per introspezionare la loro voce di chiamata punti. Questo non è standard e posso già sentire i letterati contrarsi come The Walking Jed. Tuttavia, l'ELF contiene informazioni sufficienti per inserire una libreria in un ambiente di runtime e fornire alle funzioni client correttamente codificate un modo per scoprire l'interfaccia alle funzioni fornite e chiamarle. Questa non è scienza missilistica. È semplicemente noioso. Un concetto importante qui è che uno sviluppatore che fornisce l'archivio .a e una suite di include con l'idea che stanno limitando l'uso delle librerie, è solo fastidioso. Non è un serio impedimento all'utilizzo della libreria o alla scoperta di come svolge il suo lavoro.


Una libreria statica è più o meno solo una raccolta di file oggetto. Se vuoi usare una libreria statica in un programma, devi collegare l'eseguibile con essa. L'eseguibile conterrà quindi la libreria statica (o le parti che hai usato).

Se vuoi caricare una libreria statica in fase di esecuzione usando dlopen , dovrai prima creare una libreria dinamica libfoo.so che lo contiene.


Apertura di un .a utilizzando dlopen non funziona (testato su Ubuntu 10.04). Con il seguente programma di esempio:

#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);
}

Ottengo:

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

mentre quando si utilizza /usr/lib/libz.so invece, ottengo:

dlopen error=(null)
lib_handle=0x19d6030

quindi lo stesso codice funziona per un oggetto condiviso.


Linux
  1. Caricamento di librerie condivise e utilizzo della RAM?

  2. Qual è il trucco LD_PRELOAD?

  3. Convertire una libreria statica in una libreria condivisa?

  4. Collegamento statico della funzione di libreria condivisa in gcc

  5. Qual è il significato di Avvertenza:il collegamento della libreria condivisa alla libreria statica non è portabile?

Configura una connessione di rete statica in Linux

Il collegamento statico di Linux è morto?

Come includere la libreria statica nel makefile

Come può una libreria condivisa (.so) chiamare una funzione implementata nel suo programma di caricamento?

Errore durante il caricamento della libreria condivisa (glew)

Usa una libreria C in Swift su Linux