GNU/Linux >> Tutoriales Linux >  >> Linux

cargando dinámicamente la biblioteca estática?

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.


Linux
  1. ld no puede encontrar una biblioteca existente

  2. ruta de la biblioteca cuando se carga dinámicamente?

  3. ¿La vinculación estática de Linux está muerta?

  4. ¿Cómo puede una biblioteca compartida (.so) llamar a una función que está implementada en su programa de carga?

  5. Error al cargar la biblioteca compartida (glow)

Configurar una conexión de red estática en Linux

¿Diferencia entre objetos compartidos (.so), bibliotecas estáticas (.a) y DLL (.so)?

Cómo incluir una biblioteca estática en un archivo MAKE

¿Qué es un archivo .so.2?

¿Cómo enumerar las dependencias de la biblioteca estática c/c++?

¿Qué es un archivo .so?