Análisis de bibliotecas estáticas y dinámicas de Linux

  
 

La biblioteca tiene tanto dinámica como estática. La dinámica generalmente usa .so como sufijo y estática con .a como sufijo.

Ejemplo: libhello.so libhello.a Para usar diferentes versiones de la biblioteca en el mismo sistema, puede agregar el número de versión al sufijo después del nombre del archivo de la biblioteca, por ejemplo: libhello.so.1.0, debido a la conexión predeterminada del programa Utilice .so como la extensión de archivo. Entonces, para usar estas bibliotecas, es común usar una forma de establecer conexiones simbólicas.

$ ln -s libhello.so.1.0 libhello.so.1 //No sé cuál es el uso de libhello.so.1 en este lugar? ?

$ ln -s libhello.so.1 libhello.so

1, usando la biblioteca

Cuando quiera usar una biblioteca estática, el conector encontrará el programa Las funciones requeridas se copian al archivo ejecutable. Dado que esta copia está completa, una vez que la conexión se realiza correctamente, la biblioteca estática ya no es necesaria. Sin embargo, este no es el caso de las bibliotecas dinámicas. La biblioteca dinámica deja una marca en el ejecutable que indica que la biblioteca debe cargarse primero cuando se ejecuta el programa. Dado que la biblioteca dinámica ahorra espacio, la operación predeterminada de conexión bajo Linux es conectar primero la biblioteca dinámica, es decir, si hay bibliotecas estáticas y dinámicas al mismo tiempo, si no se especifica, se conectará con la biblioteca dinámica.

Ahora suponga que hay un paquete de desarrollo de programa llamado hola, que proporciona una biblioteca estática libhello.a una biblioteca dinámica libhello.so, un archivo de encabezado hola.h, el archivo de cabecera proporciona sayhello () esta función: < Br>

/*hello.h * /

void sayhello ();

Hay alguna otra documentación.

Esta es una estructura típica de paquete de desarrollo de programas. De manera predeterminada, Linux es la conexión de la biblioteca dinámica, el siguiente programa testlib.c usa la función sayhello () en la biblioteca hello

/*testlib.c*/

#include < stdio.h >

#include " hello.h "

int main () {sayhello (); return 0;}

Use el siguiente comando para compilar $ gcc -c testlib .c -o testlib.o

Conéctese con el siguiente comando: $ gcc testlib.o -lhello -o testlib

Tenga cuidado al conectarse, suponga que faltan libhello.o y libhello.a Bajo la ruta de búsqueda de la biblioteca en /usr /lib, si desea agregar el parámetro -L a otras ubicaciones

, es más problemático conectarse con la biblioteca estática, principalmente el problema del parámetro. O el ejemplo anterior:

$ gcc testlib.o -o testlib -WI, -Bstatic -lhello # -WI, -Bstatic no tiene efecto en mi máquina, cambió a -static eficaz

Nota: Este parámetro especial "-WI, -Bstatic" se pasa realmente al conector ld. Indica que está conectado a la biblioteca estática. Si solo hay una biblioteca estática en el sistema, por supuesto, este parámetro no es necesario. Si desea conectarse a varias bibliotecas, y cada biblioteca está conectada de manera diferente, por ejemplo, el programa anterior debe estar estáticamente conectado con libhello y conectado dinámicamente con libbye. El comando debe ser: $ gcc testlib.o -o testlib -WI, -Bstatic -lhello -WI, -Bdynamic -lbye

2. Problemas de ruta para bibliotecas dinámicas Para que el ejecutable pueda encontrar bibliotecas dinámicas sin problemas, hay tres formas:

(1) Copie la biblioteca a los directorios /usr /lib y /lib.

(2) Agregue la ruta de la biblioteca en la variable de entorno LD_LIBRARY_PATH. Por ejemplo, la biblioteca dinámica libhello.so está en el directorio /home /ting /lib, usando bash como ejemplo. Use el comando:

$ export LD_LIBRARY_PATH = $ LD_LIBRARY_PATH: /home /ting /lib

( 3) Modifique el archivo /etc/ld.so.conf, agregue la ruta donde se encuentra la biblioteca al final del archivo y ejecute ldconfig para actualizar. De esta manera, todos los archivos de la biblioteca en el directorio unido son visibles.

3. Visualización de símbolos en la biblioteca

En ocasiones, puede ser necesario ver qué funciones hay en una biblioteca. El comando nm puede imprimir todos los símbolos involucrados en la biblioteca. Las bibliotecas pueden ser estáticas o dinámicas. Hay muchos símbolos listados en nm, hay tres comunes, uno se llama en la biblioteca, pero no está definido en la biblioteca (lo que indica que se necesita otro soporte de biblioteca), representado por U; uno es la función definida en la biblioteca, Este es el más común con T, el otro es el llamado símbolo "débil", que se define en la biblioteca pero puede estar cubierto por símbolos del mismo nombre en otras bibliotecas, denotadas por W. Por ejemplo, supongamos que el desarrollador quiere saber si printf () está definido en la biblioteca de saludo mencionada anteriormente:

$ nm libhello.so

Copyright © Conocimiento de Windows All Rights Reserved