Indicador de Shell en una computadora portátil con Linux

Cómo usar el comando linux ar para crear bibliotecas estáticas

Fatmawati Achmad Zaenuri / Shutterstock.com

Usar linux ar para crear bibliotecas de funciones al desarrollar software. Este tutorial le mostrará cómo crear una biblioteca estática, modificarla y usarla en un programa, junto con un código de muestra.

los ar Command es un verdadero veterano, existe desde 1971. El nombre ar se refiere al uso original previsto de la herramienta, que fue para crear archivos de almacenamiento. Un archivo de almacenamiento es un archivo único que sirve como contenedor para otros archivos. A veces, para muchos otros archivos. Los archivos se pueden agregar, eliminar o extraer del archivo. Las personas que buscan este tipo de funcionalidad ya no recurren a ar. Este papel ha sido asumido por otros servicios públicos como tar.

los ar Sin embargo, el comando todavía se usa para algunos propósitos especializados. ar se utiliza para crear bibliotecas estáticas. Estos se utilizan en el desarrollo de software. Y ar también se utiliza para crear archivos de paquetes como los archivos «.deb» utilizados en la distribución Debian Linux y sus derivados, como Ubuntu.

Seguiremos los pasos necesarios para crear y modificar una biblioteca estática y mostraremos cómo usar la biblioteca en un programa. Para hacer esto, necesitamos que la biblioteca estática cumpla con un requisito. El propósito de esta biblioteca es codificar cadenas de texto y decodificar texto codificado.

Tenga en cuenta que este es un truco rápido y sucio para fines de demostración. No utilice este cifrado para nada de valor. Es el mas simple del mundo cifrado sustituto, donde A se convierte en B, B se convierte en C, y así sucesivamente.

Las funciones cipher_encode () y cipher_decode ()

Estaremos trabajando en un directorio llamado «biblioteca» y luego crearemos un subdirectorio llamado «prueba».

Tenemos dos archivos en este directorio. En un archivo de texto llamado cipher_encode.c, tenemos el cipher_encode() función:

void cipher_encode(char *text)
{
 for (int i=0; text[i] != 0x0; i++) {
   text[i]++;
 }

} // end of cipher_encode

El corresponsal cipher_decode() la función está en un archivo de texto llamado cipher_decode.c:

void cipher_decode(char *text)
{
 for (int i=0; text[i] != 0x0; i++) {
   text[i]--;
 }

} // end of cipher_decode

Los archivos que contienen instrucciones de programación se denominan archivos de código fuente. Crearemos un archivo de biblioteca llamado libcipher.a. Contendrá las versiones compiladas de estos dos archivos de código fuente. También crearemos un archivo de texto corto llamado libcipher.h. Este es un archivo de encabezado que contiene las definiciones de las dos funciones de nuestra nueva biblioteca.

Cualquiera que tenga la biblioteca y el archivo de encabezado puede usar ambas funciones en sus propios programas. No necesitan reinventar la rueda y reescribir las funciones; solo usan las copias en nuestra biblioteca.

Compilar los archivos cipher_encode.cy cipher_decode.c

Para compilar los archivos de código fuente usaremos gcc, los Compilador estándar GNU. los -c (compilar, sin enlace) la opción indica gcc para compilar los archivos, luego deténgase. Produce un archivo intermedio de cada archivo de código fuente llamado archivo objeto. los gcc El vinculador generalmente toma todos los archivos de objeto y los vincula para crear un programa ejecutable. Omitimos este paso usando el -c opción. Solo necesitamos los archivos de objeto.

Comprobemos que tenemos los archivos que creemos que tenemos.

ls -l

Los dos archivos de código fuente están presentes en este directorio. usemos gcc para compilarlos en archivos de objeto.

gcc -c cipher_encode.c
gcc -c cipher_decode.c

No debe haber salida de gcc si todo va bien.

Esto genera dos archivos de objeto con el mismo nombre que los archivos de código fuente, pero con extensiones «.o». Estos son los archivos que debemos agregar al archivo de la biblioteca.

ls -l

Creación de la biblioteca libcipher.a

Para crear el archivo de biblioteca, que en realidad es un archivo de almacenamiento, usaremos ar.

Usamos el -c (crear) para crear el archivo de biblioteca, el -r (agregar con reemplazar) para agregar los archivos al archivo de la biblioteca, y la opción -s (índice) opción para crear un índice de los archivos dentro del archivo de la biblioteca.

Llamaremos al archivo de biblioteca libcipher.a. Proporcionamos este nombre en la línea de comando, así como los nombres de los archivos de objeto que agregaremos a la biblioteca.

ar -crs libcipher.a cipher_encode.o cipher_decode.o

Si listamos los archivos en el directorio, veremos que ahora tenemos un archivo libcipher.a.

ls -l

Si usamos el -t (tabla) opción con ar podemos ver los módulos dentro del archivo de la biblioteca.

ar -t libcipher.a

Creando el archivo de encabezado libcipher.h

El archivo libcipher.h se incluirá en cualquier programa que utilice la biblioteca libcipher.a. El archivo libcipher.h debe contener la definición de las funciones que están en la biblioteca.

Para crear el archivo de encabezado, necesitamos ingresar las definiciones de función en un editor de texto como gedit. Nombra el archivo «libcipher.h» y guárdalo en el mismo directorio que el archivo libcipher.a.

void cipher_encode(char *text);
void cipher_decode(char *text);

Usando la biblioteca libcipher

La única forma segura de probar nuestra nueva biblioteca es escribir un pequeño programa para usarla. Primero, crearemos un directorio llamado test.

mkdir test

Copiaremos la biblioteca y los archivos de encabezado al nuevo directorio.

cp libcipher.* ./test

Cambiaremos al nuevo directorio.

cd test

Revisemos que nuestros dos archivos estén aquí.

ls -l

Necesitamos crear un pequeño programa que pueda usar la biblioteca y demostrar que funciona como se esperaba. Escriba las siguientes líneas de texto en un editor. Guarde el contenido del editor en un archivo llamado «test.c» en el directorio de prueba.

#include <stdio.h>
#include <stdlib.h>

#include "libcipher.h"

int main(int argc, char *argv[])
{
 char text[]="How-To Geek loves Linux";

 puts(text);

 cipher_encode(text);
 puts(text);

 cipher_decode(text);
 puts(text);

 exit (0);

} // end of main

El programa es muy sencillo:

  • Incluye el archivo libcipher.h para que pueda ver las definiciones de funciones en la biblioteca.
  • Crea una cadena llamada «texto» y almacena las palabras «How-To Geek loves Linux» en ella.
  • Imprime esta cadena en la pantalla.
  • el lo llama cipher_encode() función para codificar la cadena, e imprime la cadena codificada en la pantalla.
  • él llama cipher_decode() para decodificar el canal e imprime el canal decodificado en la pantalla.

Para generar el test programa, necesitamos compilar el programa test.cy vincularlo en la biblioteca. los -o (salida) la opción dice gcc cómo llamar al programa ejecutable que genera.

gcc test.c libcipher.a -o test

gcc silenciosamente lo regresa al símbolo del sistema, todo está bien. Ahora probemos nuestro programa. Momento de la verdad:

./test

Y vemos el resultado esperado. los test el programa imprime el texto sin formato imprime el texto cifrado y luego imprime el texto descifrado. Utiliza las funciones de nuestra nueva biblioteca. Nuestra biblioteca está funcionando.

Éxito. Pero, ¿por qué detenerse ahí?

Agregar otro módulo a la biblioteca

Agreguemos otra función a la biblioteca. Vamos a agregar una función que el programador puede usar para mostrar la versión de la biblioteca que está usando. Necesitaremos crear la nueva función, compilarla y agregar el nuevo archivo de objeto al archivo de biblioteca existente.

Escriba las siguientes líneas en un editor. Guarde el contenido del editor en un archivo llamado cipher_version.c, en el directorio de la biblioteca.

#include <stdio.h>

void cipher_version(void)
{
 puts("How-To Geek :: VERY INSECURE Cipher Library");
 puts("Version 0.0.1 Alphan");

} // end of cipher_version

Necesitamos agregar la definición de la nueva función al archivo de encabezado libcipher.h. Agregue una nueva línea al final de este archivo, para que se vea así:

void cipher_encode(char *text);
void cipher_decode(char *text);
void cipher_version(void);

Guarde el archivo libcipher.h modificado.

Necesitamos compilar el archivo cipher_version.c para tener un archivo objeto cipher_version.o.

gcc -c cipher_version.c

Esto crea un archivo cipher_version.o. Podemos agregar el nuevo archivo de objeto a la biblioteca libcipher.a con el siguiente comando. los -v La opción (detallada) la hace generalmente silenciosa ar cuéntanos lo que hizo.

ar -rsv libcipher.a cipher_version.o

El nuevo archivo de objeto se agrega al archivo de biblioteca. ar imprime la confirmación. La «a» significa «agregado».

Podemos usar el -t (tabla) para ver qué módulos están en el archivo de la biblioteca.

ar -t libcipher.a

Ahora hay tres módulos en nuestro archivo de biblioteca. Usemos la nueva función.

Usando la función cipher_version ().

Eliminemos la biblioteca anterior y el archivo de encabezado del directorio de prueba, copiemos los archivos nuevos y luego regresemos al directorio de prueba.

Eliminaremos las versiones antiguas de los archivos.

rm ./test/libcipher.*

Copiaremos las nuevas versiones al directorio de prueba.

cp libcipher.* ./test

Cambiaremos al directorio de prueba.

cd test

Y ahora podemos modificar el programa test.c para usar la nueva función de biblioteca.

Necesitamos agregar una nueva línea al programa test.c que llama cipher_version() función. Colocaremos esto antes de la primera puts(text); línea.

#include <stdio.h>
#include <stdlib.h> 

#include "libcipher.h" 

int main(int argc, char *argv[]) 
{
 char text[]="How-To Geek loves Linux"; 

 // new line added here
 cipher_version(); 

 puts(text); 
 
 cipher_encode(text); 
 puts(text); 
 
 cipher_decode(text); 
 puts(text); 

 exit (0); 

} // end of main

Guárdelo como test.c. Ahora podemos compilarlo y probar que la nueva función está operativa.

gcc test.c libcipher.a -o test

Ejecutemos la nueva versión de test:

La nueva función está funcionando. Podemos ver la versión de la biblioteca al comienzo de la salida de test.

Pero puede haber un problema.

Reemplazo de un módulo en la biblioteca

Esta no es la primera versión de la biblioteca; este es el segundo. Nuestro número de versión es incorrecto. La primera versión no tenía cipher_version() función en él. Este lo hace. Entonces debería ser la versión «0.0.2». Necesitamos reemplazar el cipher_version() función en la biblioteca con un fijo.

Afortunadamente, ar hace que esto sea muy fácil de hacer.

Primero, editemos el archivo cipher_version.c en el directorio de la biblioteca. Sustitúyase el texto «Versión 0.0.1 Alfa» por «Versión 0.0.2 Alfa». Debe tener un aspecto como este:

#include <stdio.h>

void cipher_version(void)
{
 puts("How-To Geek :: VERY INSECURE Cipher Library");  
 puts("Version 0.0.2 Alphan"); 

} // end of cipher_version

Guarde este archivo. Necesitamos compilarlo nuevamente para crear un nuevo archivo de objeto cipher_version.o.

gcc -c cipher_version.c

Ahora reemplazaremos el objeto cipher_version.o existente en la biblioteca con nuestra nueva versión compilada.

Usamos el -r (agregar con reemplazar) antes, para agregar nuevos módulos a la biblioteca. Cuando lo usamos con un módulo que ya existe en la biblioteca, ar reemplazará la versión anterior por la nueva. los -s (índice) actualizará el índice de la biblioteca y -v (detallado) la opción servirá ar cuéntanos lo que hizo.

ar -rsv libcipher.a cipher_version.o

Esta vez ar informa que reemplazó el módulo cipher_version.o. La «r» significa reemplazado.

Usando la función cipher_version () actualizada

Necesitamos usar nuestra biblioteca modificada y verificar que funcione.

Copiaremos los archivos de la biblioteca al directorio de prueba.

cp libcipher.* ./test

Cambiaremos al directorio de prueba.

cd ./test

Necesitamos compilar nuestro programa de prueba nuevamente con nuestra nueva biblioteca.

gcc test.c libcipher.a -o test

Y ahora podemos probar nuestro programa.

./test

El resultado del programa de prueba es el que esperábamos. El número de versión correcto se muestra en la cadena de versión, y las rutinas de cifrado y descifrado funcionan.

Eliminar módulos de una biblioteca

Parece una pena después de todo esto, pero eliminemos el archivo cipher_version.o del archivo de la biblioteca.

Para hacer esto, usaremos el -d (eliminar) opción. También usaremos el -v opción (detallada), de modo que ar nos cuenta lo que hizo. También incluiremos el -s (índice) opción para actualizar el índice en el archivo de la biblioteca.

ar -dsv libcipher.a cipher_version.o

ar informa que ha eliminado el módulo. La «d» significa «eliminado».

Si preguntamos ar para enumerar los módulos dentro del archivo de la biblioteca, veremos que hemos vuelto a dos módulos.

ar -t libcipher.a

Si va a eliminar módulos de su biblioteca, asegúrese de eliminar su definición del archivo de encabezado de la biblioteca.

Comparte tu código

Las bibliotecas hacen que el código se pueda compartir de una manera cómoda pero privada. Cualquiera a quien le dé el archivo de la biblioteca y el archivo de encabezado puede usar su biblioteca, pero su código fuente real se mantiene privado.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Experto Geek - Tu Guía en Tendencias Tecnológicas