Linux Básico: Bibliotecas Estáticas vs Librerías Dinámicas

Erika Caoili

Seguir

Dec 17, 2019 · 4 min read

Foto: Edwin Andrade en Unsplash

¿Qué es una biblioteca en Linux?

¿Por qué usamos bibliotecas?

¿Cómo crear una biblioteca estática y dinámica?

¿Cómo y por qué los usamos?

Una biblioteca en Linux

Una biblioteca es una colección de piezas de código precompiladas llamadas funciones. La biblioteca contiene funciones comunes y juntas forman un paquete llamado biblioteca. Las funciones son bloques de código que se reutilizan en todo el programa. El uso de los fragmentos de código de nuevo en un programa ahorra tiempo. Evita que el programador reescriba el código varias veces. Para los programadores, las bibliotecas proporcionan funciones reutilizables, estructuras de datos, clases, etc.

«Por ejemplo, si está creando una aplicación que necesita realizar operaciones matemáticas, no tiene que crear una nueva función matemática para eso, simplemente puede usar funciones existentes en bibliotecas para ese lenguaje de programación.»(«Comprensión De Las Bibliotecas Compartidas En Linux»)

Una biblioteca no es ejecutable y eso es una diferencia clave de los procesos y las aplicaciones. Las bibliotecas desempeñan su papel en tiempo de ejecución o de compilación. En el lenguaje de programación C, tenemos dos tipos de bibliotecas: bibliotecas dinámicas y bibliotecas estáticas.

Las bibliotecas tienen archivos objeto creados por "-c" gcc flag y terminan en ".o" por convención. Son el resultado de la salida del compilador y contienen definiciones de funciones en forma binaria.

Diferencias entre Bibliotecas Dinámicas y Estáticas

Las bibliotecas dinámicas tienen un»*. Por lo tanto, la convención de nomenclatura y las bibliotecas estáticas tienen un»*.un».

Las bibliotecas dinámicas o compartidas se producen como archivos separados fuera de los archivos ejecutables. Por lo tanto, solo necesita una copia de los archivos de la biblioteca en tiempo de ejecución. En tiempo de compilación, las bibliotecas estáticas permanecen bloqueadas en un programa. Contiene los programas del archivo que contienen una copia de los archivos de la biblioteca en tiempo de compilación.

Cuando se utiliza una biblioteca dinámica, el programador hace referencia a esa biblioteca cuando lo necesita en tiempo de ejecución. Por ejemplo, para acceder a la función de longitud de cadena desde standard input/output header file, puede acceder a ella dinámicamente. Encontrará la referencia de la biblioteca del programa en tiempo de ejecución debido al cargador dinámico. Luego carga esa función de longitud de cadena en la memoria. Por lo tanto, la accesibilidad dinámica de la biblioteca debe estar fácilmente disponible o se vuelve impotente.

Ventajas y desventajas de las bibliotecas dinámicas

  1. Solo necesita una copia en tiempo de ejecución. Depende de que la aplicación y la biblioteca estén estrechamente disponibles entre sí.
  2. Varias aplicaciones en ejecución utilizan la misma biblioteca sin necesidad de que cada archivo tenga su propia copia.
  3. Sin embargo, ¿qué pasa si la biblioteca dinámica se daña? El archivo ejecutable puede no funcionar porque vive fuera del ejecutable y es vulnerable a la rotura.
  4. Contienen archivos más pequeños.
  5. Las bibliotecas dinámicas están vinculadas en tiempo de ejecución. No requiere recompilación y volver a enlazar cuando el programador realiza un cambio.

En tiempo de compilación, las aplicaciones utilizan bibliotecas estáticas. Todas las copias de las funciones se colocan en el archivo de la aplicación porque son necesarias para ejecutar el proceso.

Ventajas y desventajas de las bibliotecas estáticas

  1. Las bibliotecas estáticas resisten la vulnerabilidad porque viven dentro del archivo ejecutable.
  2. La velocidad en tiempo de ejecución se produce más rápido porque su código objeto (binario) está en el archivo ejecutable. Por lo tanto, las llamadas realizadas a las funciones se ejecutan más rápido. Recuerde, la biblioteca dinámica vive fuera del ejecutable, por lo que las llamadas se realizarían desde el exterior del ejecutable.
  3. Los cambios realizados en los archivos y el programa requieren volver a enlazar y recompilar.
  4. El tamaño del archivo es mucho mayor.

¿Cómo se crea una biblioteca estática y dinámica?

Para ambas bibliotecas, el programa debe incluir un prototype para cada una de las funciones que existen en la biblioteca. Si usa un archivo de encabezado, no olvide incluir header filename.

#include "<header file name>"

Bibliotecas dinámicas

Para crear una biblioteca dinámica, escriba el siguiente comando:

gcc -g -fPIC -Wall -Werror -Wextra -pedantic *.c -shared -o liball.so

Con el "*.c": toma todos los archivos fuente de C del directorio actual y crea una biblioteca compartida llamada "liball.so." El indicador -fPIC permite hacer referencia al siguiente código en cualquier dirección virtual en tiempo de ejecución. Significa Código Independiente de Posición.La biblioteca no contiene datos en direcciones fijas porque su ubicación en la memoria cambiará entre programas. Los archivos objeto se compilan usando -shared flag. El compiler identificará más tarde una biblioteca buscando archivos que comiencen con "lib" y terminen con la convención de nombres, .so

El programa necesita la ruta para buscar los archivos de la biblioteca. Por lo tanto, debe escribir el siguiente comando para agregar esa ubicación a la variable de entorno llamada LD_LIBRARY_PATH.

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH

Al usar la biblioteca dinámica, escriba el siguiente comando:

gcc -g -wall -o app app.c liball.so

Bibliotecas estáticas

Para crear una biblioteca estática, necesitamos usar el siguiente comando:

ar rc liball.a dog.o cat.o bird.o

"ar" significa archive y se usa para crear la biblioteca estática. Todos los archivos que terminan en ".o" se agregarán a liball.a library y en este caso son los archivos objeto.

El -rc flag hará dos cosas: reemplazar y crear una nueva biblioteca si aún no existe. El siguiente paso es la indexación, para hacer eso, escribimos:

ranlib liball.a

Al usar la biblioteca estática, escriba el siguiente comando:

gcc main.c -L -l<filename>

El -L flag accede al linker para que las bibliotecas se puedan encontrar en el directorio dado. Además, también busca otras ubicaciones donde el compilador busca bibliotecas del sistema.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.