Un .a es un archivo que contiene uno o más objetos .o elf. Readelf y objdump no los analizarán. Debe usar ar para extraer los archivos .o del archivo. Es importante darse cuenta de que si está dispuesto a dedicar tiempo a escribir y depurar una variante de load_elf() que puede envolver una o más bibliotecas estáticas en una HAL, puede cargarlas dinámicamente y proporcionar a los clientes una forma de introspección de su entrada de llamada. puntos. Esto no es estándar, y ya puedo sentir a los literatos retorciéndose como The Walking Jed. Sin embargo, el ELF contiene suficiente información para colocar una biblioteca en un entorno de tiempo de ejecución y brindar funciones de cliente codificadas correctamente una forma de descubrir la interfaz de las funciones proporcionadas y llamarlas. Esto no es ciencia espacial. Es simplemente tedioso. Un concepto importante aquí es que un desarrollador que proporciona el archivo .a y un paquete de inclusión con la idea de que están restringiendo el uso de las bibliotecas, simplemente está siendo molesto. No es un impedimento serio para usar la biblioteca o descubrir cómo hace su trabajo.
Una biblioteca estática es más o menos una colección de archivos de objetos. Si desea utilizar una biblioteca estática en un programa, debe vincular el ejecutable con él. El ejecutable contendrá la biblioteca estática (o las partes que usó).
Si desea cargar una biblioteca estática en tiempo de ejecución usando dlopen
, primero deberá crear una biblioteca dinámica libfoo.so
que lo contiene.
Abriendo un .a
archivo usando dlopen
no trabajo (probado en Ubuntu 10.04). Con el siguiente programa de ejemplo:
#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);
}
obtengo:
dlopen error=/usr/lib/libz.a: invalid ELF header
lib_handle=(nil)
mientras que al usar /usr/lib/libz.so
en cambio, obtengo:
dlopen error=(null)
lib_handle=0x19d6030
entonces el mismo código funciona para un objeto compartido.